Ulrich Hecker: URL/Pfad zum Stylesheet einer XML-Datei aus XSL-Datei auslesen

Hallo,

wie schon im Subject erwähnt, habe ich folgendes Problem:

Meine XML-Datei referenziert z.B. folgendes XSL(T)-Stylesheet:

...
<?xml-stylesheet type="text/xsl" href="e:\projekt\artikel.xsl"?>
...

Jetzt möchte ich von der dort angegebenen XSL(T)-Datei aus genau den unter href="..." angegebenen Pfad auslesen, etwa so wie

<xsl:value-of select="...">

oder auch anders per Javascript oder ähnliches, Hauptsache, der Pfad ist der richtige. Lese ich nämlich den Pfad über Javascript mit

var pfad = document.URL

aus, bekomme ich immer den Pfad der bereits transformierten Datei und nicht den der Original-XSL...

Weiß hier jemand Rat?

Danke, Uli

  1. Hallo Uli,

    wie schon im Subject erwähnt, habe ich folgendes Problem:

    Meine XML-Datei referenziert z.B. folgendes XSL(T)-Stylesheet:

    ...
    <?xml-stylesheet type="text/xsl" href="e:\projekt\artikel.xsl"?>
    ...

    Jetzt möchte ich von der dort angegebenen XSL(T)-Datei aus genau den unter href="..." angegebenen Pfad auslesen, etwa so wie

    <xsl:value-of select="...">

    oder auch anders per Javascript oder ähnliches, Hauptsache, der Pfad ist der richtige. Lese ich nämlich den Pfad über Javascript mit

    var pfad = document.URL

    aus, bekomme ich immer den Pfad der bereits transformierten Datei und nicht den der Original-XSL...

    Weiß hier jemand Rat?

    Dazu bietet X-Path den speziellen Knotentest processing-instruction(), der Dir Knoten vom Typ Processing-Instruction auswählt. Du musst ein Template schreiben das für diesen Knotentyp gilt. Um sicherzugehen, dass Du nicht ALLE (falls du noch andere hast) Processing-Instructions auswählst, solltest du den Namen als Argument übergeben (nicht die Anführungszeichen vergessen!). Also etwa so:

    <xsl:template match="processing-instruction('xml-stylesheet')>
      <xsl:value-of select="."/>
    </xsl:template>

    Auf diese Weise kannst Du dann die gesamte PI ausgeben. Das Ergebnis in Deinem Falle wäre:

    type="text/xsl" href="e:\projekt\artikel.xsl"

    So nun musst Du noch an den Pfad kommen. Da aber type und href Pseudo-Attribute sind, kannst du nicht über @ oder sonstwas darauf zugreifen, sondern kommst nur über String-Funktionen ran. Z.B. so:

    <xsl:template match="processing-instruction('xml-stylesheet')>
      <xsl:value-of select="substring-after(., 'href=')"/>
    </xsl:template>

    Ergebnis dann:
    "e:\projekt\artikel.xsl"

    Gruß
    Franz