Saxon XSL 转换的查找目录
Lookup directory for Saxon XSL transformation
我有两个 xml
文件和对它们的 xsl
转换:
items.xml
:
<items>
<item id="1">
<name>Item1</name>
</item>
<item id="2">
<name>Item2</name>
</item>
</items>
details.xml
:
<details>
<item id="1">
<details>Item1 details</details>
</item>
</details>
merge.xsl
:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/items">
<items>
<xsl:for-each select="item">
<item>
<xsl:variable name="item-id" select="@id"/>
<name>
<xsl:value-of select="name/text()"/>
</name>
<xsl:if test="document('details.xml')/details/item[@id=$item-id]">
<details>
<xsl:value-of select="document('details.xml')/details/item[@id=$item-id]/details/text()"/>
</details>
</xsl:if>
</item>
</xsl:for-each>
</items>
</xsl:template>
</xsl:stylesheet>
merge.xml
是绝对路径,xml
文件是相对路径。
要转换它们,我使用 Saxon jar:
java -jar /jars/saxon.jar -s:items.xml -xsl:/xsl/merge.xsl
但它向我显示警告并且无法通过相对路径找到 details.xml
(merge.xsl
中的 document('details.xml')
):
Warning at char 9 in xsl:if/@test on line 13 column 77 of merge.xsl:
FODC0002: I/O error reported by XML parser processing
file:/xsl/details.xml:
/xsl/details.xml (No such file or directory)
如果我将 merge.xsl
放在同一个目录中,它工作正常并按预期合并两个 xml
文件,但不可能每次都手动执行。
是否可以将 Saxon 转换器配置为从 document('file.xml')
中查找 xml
文件,这些文件位于与这些文档所在的同一目录中,而不是在 xsl
目录中?
document
函数 https://www.w3.org/TR/xslt20/#document 有第二个参数 provide/infer 用于解析第一个参数的基本 URI,因此您希望 document('details.xml', .)
或 document('details.xml', /)
使用主输入文档中的节点作为从而非样式表文档推断基本 URI 的节点。
我有两个 xml
文件和对它们的 xsl
转换:
items.xml
:
<items>
<item id="1">
<name>Item1</name>
</item>
<item id="2">
<name>Item2</name>
</item>
</items>
details.xml
:
<details>
<item id="1">
<details>Item1 details</details>
</item>
</details>
merge.xsl
:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/items">
<items>
<xsl:for-each select="item">
<item>
<xsl:variable name="item-id" select="@id"/>
<name>
<xsl:value-of select="name/text()"/>
</name>
<xsl:if test="document('details.xml')/details/item[@id=$item-id]">
<details>
<xsl:value-of select="document('details.xml')/details/item[@id=$item-id]/details/text()"/>
</details>
</xsl:if>
</item>
</xsl:for-each>
</items>
</xsl:template>
</xsl:stylesheet>
merge.xml
是绝对路径,xml
文件是相对路径。
要转换它们,我使用 Saxon jar:
java -jar /jars/saxon.jar -s:items.xml -xsl:/xsl/merge.xsl
但它向我显示警告并且无法通过相对路径找到 details.xml
(merge.xsl
中的 document('details.xml')
):
Warning at char 9 in xsl:if/@test on line 13 column 77 of merge.xsl:
FODC0002: I/O error reported by XML parser processing
file:/xsl/details.xml:
/xsl/details.xml (No such file or directory)
如果我将 merge.xsl
放在同一个目录中,它工作正常并按预期合并两个 xml
文件,但不可能每次都手动执行。
是否可以将 Saxon 转换器配置为从 document('file.xml')
中查找 xml
文件,这些文件位于与这些文档所在的同一目录中,而不是在 xsl
目录中?
document
函数 https://www.w3.org/TR/xslt20/#document 有第二个参数 provide/infer 用于解析第一个参数的基本 URI,因此您希望 document('details.xml', .)
或 document('details.xml', /)
使用主输入文档中的节点作为从而非样式表文档推断基本 URI 的节点。