Hallo,
ich suche eine Möglichkeit, den Pfad zur aktuell transformierten Datei während eines Transformvorgangs zu erhalten, um auf eine andere Datei zuzugreifen, die im gleichen Verzeichnis liegt. Grundlegend geht es darum:
Source: /test/xyz-source.xml
2. Datei: /test/xyz-source2.xml
- In der xyz-source.xml lese ich einen Wert aus, der in der xyz-source2.xml ein Element ist, dass ich dann folgend auslesen will per:
document(xyz-source2.xml)/element
Den Namen der Datei xyz-source2.xml habe ich zum Transform-Zeitpunkt, aber nicht den Pfad. Der Pfad des XSL-Templates ist ein anderer, insofern helfen mir relative Pfadangaben nicht.
Ich dachte nun, dass ich über document-uri daran komme:
<xsl:value-of select="fn:document-uri(.)"/>
aber dabei sagt er: Exception: javax.xml.transform.TransformerException: java.lang.NoSuchMethodException: For extension function, could not find method org.apache.xpath.objects.XNodeSet.documentUri([ExpressionContext,] ).
Wenn ich <xsl:value-of select="fn:document-uri(fn:root())"/> benutze, gibt es:
Exception: javax.xml.transform.TransformerException: javax.xml.transform.TransformerException: Instanzenmethoden-Aufruf von Methode root erfordert eine Object-Instanz als erstes Argument
Die Spezifikation sagt: "root() Returns the root of the tree to which the current node or the specified belongs. This will usually be a document node" - und daher dachte ich, die Methode root gibt mir einen entsprechendes Node-Objekt zurück.
Dazu finde ich leider keine weitere Info - deshalb meine Frage hier. Vielen Dank schon mal für etwaige Antworten! Untenstehend finden sich die Testdateien mit denen ich gearbeitet habe.
LG, basi
xyz-source.xml (das zweite xml-file ist ja uninteressant):
<module>
<entitylist>
<entity name="e1"/>
<entity name="e2"/>
<entity name="e3"/>
</entitylist>
</module>
XSL-Template:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/02/xpath-functions">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:call-template name="moduletemplate"/>
</xsl:template>
<xsl:template name="moduletemplate">
<xsl:for-each select="./module/entitylist/entity">
xsl:text entity:</xsl:text>
<xsl:value-of select="./@name"/>
<xsl:value-of select="fn:document-uri(fn:root())"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>