Steffen F.: auf element mit id zugreifen

Hallo,

wie kann man am schnellste auf ein element mit einer bestimmten id zugreifen wenn man xsl:value-of select="document('aURI')/???" verwendet, um die entsprechende xml datei auszulesen? Was ist hier die beste methode, wenn die elemente auf unterschiedlichen ebenen sind, die id aber wirklich einmalig vergeben sind? mit meiner xpath anweisung ist es ziemlich langsam //*[@id = 'XXX']

Dankbar fuer Vorschläge

S.

  1. Hallo,

    wie kann man am schnellste auf ein element mit einer bestimmten id zugreifen wenn man xsl:value-of select="document('aURI')/???" verwendet, um die entsprechende xml datei auszulesen? Was ist hier die beste methode, wenn die elemente auf unterschiedlichen ebenen sind, die id aber wirklich einmalig vergeben sind? mit meiner xpath anweisung ist es ziemlich langsam //*[@id = 'XXX']

    document('aURI')/id('XXX').

    Aber es _muss_ ein ID sein. Siehe dazu auch ie Erklärung: http://aktuell.de.selfhtml.org/artikel/xml/gruppierung1/#xmldtd

    Grüße
    Thomas

    1. Hallo Thomas,

      danke für die Antwort, aber die Funktion hatte ich schon ausprobiert und sie läuft ins Leere - soll heissen, kein Knoten wird ausgewählt.

      <xsl:value-of select="document('document.xml')//*[@id = string($ID_Nr)]/@name"/> diese Anweisung gibt mir das Attribute name zurueck

      <xsl:value-of select="document('document.xml')/id(string($ID_Nr))/@name"/> diese Anweisung läuft ins Leere.

      Bei mir kommt saxon8.9 zum Einsatz. Habe ich jetzt etwas falsch verstanden?

      Gruß, S.

      1. Hallo,

        danke für die Antwort, aber die Funktion hatte ich schon ausprobiert und sie läuft ins Leere - soll heissen, kein Knoten wird ausgewählt.

        <xsl:value-of select="document('document.xml')//*[@id = string($ID_Nr)]/@name"/> diese Anweisung gibt mir das Attribute name zurueck

        <xsl:value-of select="document('document.xml')/id(string($ID_Nr))/@name"/> diese Anweisung läuft ins Leere.

        Bei mir kommt saxon8.9 zum Einsatz. Habe ich jetzt etwas falsch verstanden?

        string() ist hier unnötig.

        Ist "$ID_Nr" wirklich eine _XML-ID_? http://de.selfhtml.org/xml/dtd/attribute.htm#mit_identifikationswert (unter "Beachten Sie").
        Der Name deiner Variable läßt darauf schließen, dass dein "ID" eine Nummer ist, was als ID im Sinne von XML ungültig wäre, weshalb die id()-Funktion nicht greift.

        Grüße
        Thomas

        1. Hallo Thomas,

          Nein, das Beispiel war etwas missverständlich, das Dokument enthält schon die id in der Form id="something_anotheruniquestring". Jetzt stellt sich für mich die Frage, muss dem Dokument ein Schema angehangen sein, und wenn ja, könnte es daran liegen, dass das Schema "ausserhalb" liegt, also in der form schemalocation als http://internetip/schema.xsd . Der Parser aber in dem Moment nicht auf das externe Schema zugreifen kann? Ich kann das nur schwerlich hier testen.

          Gruß, S.

          1. Hallo,

            Nein, das Beispiel war etwas missverständlich, das Dokument enthält schon die id in der Form id="something_anotheruniquestring". Jetzt stellt sich für mich die Frage, muss dem Dokument ein Schema angehangen sein, und wenn ja, könnte es daran liegen, dass das Schema "ausserhalb" liegt, also in der form schemalocation als http://internetip/schema.xsd . Der Parser aber in dem Moment nicht auf das externe Schema zugreifen kann? Ich kann das nur schwerlich hier testen.

            Ja, deshalb habe ich dir in der ersten Antwort den Artikel verlinkt (wo genau auf den Umstand verwiesen wird: dass der XSL-Parser wissen muss, was in deinem Dokument als eine ID gilt. Das bekommt er vom XML-Parser. Wenn es keine Informationen darüber gibt, was als ID gilt (weil keine DTD/Schema), kann auch der XSL-Prozessor nicht wissen was er als ID nehmen soll. Daher funktioniert id() nicht. Dann bleibt dir nur der Weg, denn du schon genommen hast.

            Grüße
            Thomas

            1. Danke,

              schafft Klarheit, werde es wohl mal lokal testen, aber in der Umgebung, in der der Parser läuft, kann das Schema wohl nicht eingelesen werden, obwohl es richtig deklariert ist. Danke noch einmal.

              Gruß

              1. Hallo,

                schafft Klarheit, werde es wohl mal lokal testen, aber in der Umgebung, in der der Parser läuft, kann das Schema wohl nicht eingelesen werden, obwohl es richtig deklariert ist. Danke noch einmal.

                Nochwas: ich habe teilweise "gelogen":
                "document('document.xml')/id($ID_Nr)/@name" funktioniert, aber nur mit XSLT 2.0.

                Wenn du XSLT 1.0 brauchst geht z.B. so:
                <xsl:for-each select="document('document.xml')">
                 <xsl:value-of select="id($ID_Nr)/@name"/>
                </xsl:for-each>

                Hat damit zu tun, dass in XSLT 1.0 id() immer für das Dokument gilt in dem auch der Kontextknoten ist (deshalb muss man den (z.B. mit for-each) wechseln)

                Die Sache mit der ID und das Vorhandensein von DTD/Scheme bleibt trotzdem!

                Grüße
                Thomas