Dateipfad zur aktuell transformierten Datei erhalten
basi
- xsl
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
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>