Simon Reinhardt: Ignoriert Xalan Fragment-Identifier?

Hallo,

ich habe folgendes Element:

<include href="andereDatei.xml#ElementID" />

Das Stylesheet soll jetzt in die Datei gehen und das Element mit der angegebenen ID raussuchen. Mein Template dazu:

<xsl:template match="include">
 <xsl:apply-templates select="document(@href)" />
</xsl:template>

Aber egal was ich als Fragment Identifier übergebe, Xalan liefert immer das Root-Node der Datei. (Außerdem fordert er mich auf, den Slash zu kodieren (/->%2F), obwohl dies laut XPointer-Doku eigentlich nicht nötig sein sollte.)
Hänge ich hingegen an die document()-Funktion einen Pfad dran, funktioniert es.
Falls dies kein Fehler sein sollte: gäbe es irgendeinen anderen Weg, den XPath auf das externe Element in meinem <include>-Element zu übergeben?

Vielen Dank & VG,
  Simon

  1. Hallo Simon,

    ich habe folgendes Element:

    <include href="andereDatei.xml#ElementID" />

    Das Stylesheet soll jetzt in die Datei gehen und das Element mit der angegebenen ID raussuchen. Mein Template dazu:

    <xsl:template match="include">
    <xsl:apply-templates select="document(@href)" />
    </xsl:template>

    Aber egal was ich als Fragment Identifier übergebe, Xalan liefert immer das Root-Node der Datei.

    klar. der prozessor weiss ja nicht was du ihm übergibst. kann ihm ja aich egal sein. aber mich hat er nicht aufgefordert den # zu maskieren.

    (Außerdem fordert er mich auf, den Slash zu kodieren (/->%2F), obwohl dies laut XPointer-Doku eigentlich nicht nötig sein sollte.)

    aber Xpointer würde dir "andereDatei.xml#xpointer(id('ElementID'))" sagen.

    Falls dies kein Fehler sein sollte: gäbe es irgendeinen anderen Weg, den XPath auf das externe Element in meinem <include>-Element zu übergeben?

    du könntest es so machen:

    <xsl:template match="include">
    <xsl:variable name="idWert" select="substring-after(@href,'#')" />
    <xsl:apply-templates select="document(@href)//*[@id = $idWert]"/>
    </xsl:template>

    grüße
    Thomas

    1. Hi Thomas,

      aber Xpointer würde dir "andereDatei.xml#xpointer(id('ElementID'))" sagen.

      Hm, in der XPointer-Doku steht, dass "andereDatei.xml#xpointer(id('ElementID'))" == "andereDatei.xml#ElementID" ist. Und die erste Variante habe ich auch schon ausprobiert.

      du könntest es so machen:

      <xsl:template match="include">
      <xsl:variable name="idWert" select="substring-after(@href,'#')" />
      <xsl:apply-templates select="document(@href)//*[@id = $idWert]"/>
      </xsl:template>

      Ja, aber eigentlich sollten in meinem <include>-Element beliebige XPath-Ausdrücke möglich sein. Aber dann muss die ID wohl erstmal reichen :(

      Danke,
        Simon

      1. Hallo Simon,

        <xsl:template match="include">
        <xsl:variable name="idWert" select="substring-after(@href,'#')" />
        <xsl:apply-templates select="document(@href)//*[@id = $idWert]"/>
        </xsl:template>

        Ja, aber eigentlich sollten in meinem <include>-Element beliebige XPath-Ausdrücke möglich sein. Aber dann muss die ID wohl erstmal reichen :(

        das kannst du, nur muss du dann zusehen, dass du diese angaben auch irgendwie dass auwerten kannst. ob du nun dazu diverse xsl-funktionen verwendest (substring-a/b etc.) oder direkt den ausdruck hinschreibt, ist egal.

        grüße
        thomas

  2. Hallo Simon,

    Aber egal was ich als Fragment Identifier übergebe, Xalan liefert immer das Root-Node der Datei. (Außerdem fordert er mich auf, den Slash zu kodieren (/->%2F), obwohl dies laut XPointer-Doku eigentlich nicht nötig sein sollte.)

    XPointer ist hier eigentlich gar nicht involviert, ein XSLT-Prozessor hält sich an die XSLT-Spec plus XPath.

    Die XSLT-Spec sagt zum Thema der angehängten Fragment-Identifier:
    "The semantics of the fragment identifier is dependent on the media type of the result of retrieving the URI"
    und
    "An XSLT processor is not required to support any particular media types."
    Und das tut Xalan eben nicht. Allerdings kenne ich auch keinen der es tut, es müsste dann ja immer noch einen Standard geben, wie denn der FragmentIdentifier zu interpretieren sei für den jeweiligen MIME type. Ist es ein Elementname, eine Pfadangabe eine ID, win Attributname....

    Gruß
    Franz

    PS: Das mit dem Slash verstehe ich auch nicht, bei mir gibt es keine Aufforderung den zu maskieren, weder bei Xalan1 noch Xalan2

  3. ich habe folgendes Element:

    <include href="andereDatei.xml#ElementID" />

    Das Stylesheet soll jetzt in die Datei gehen und das Element mit der angegebenen ID raussuchen.

    Das ist dein Wunsch, das muss es aber nicht, geschweige denn wird es das. Was Fragmentbezeichner für XML-Dokumente bedeuten ist undefiniert.