xml - Saxon XSL 转换的查找目录
问题描述
我有两个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
通过相对路径(document('details.xml')
in merge.xsl
)找到:
在 xsl:if/@test 的第 13 行第 77 行的 merge.xsl 中的第 9 个字符处发出警告:
FODC0002:XML 解析器处理文件报告的 I/O 错误
:/xsl/details.xml:
/xsl/details.xml(没有这样的文件或目录)
如果我把它放在merge.xsl
同一个目录中,它工作正常并按xml
预期合并两个文件,但不可能每次都手动完成。
是否可以将 Saxon 转换器配置为xml
从与这些文档所在的同一目录中查找文件document('file.xml')
,而不是在xsl
目录中?
解决方案
document
函数https://www.w3.org/TR/xslt20/#document有第二个参数,用于提供/推断用于解析第一个参数的基本 URI,因此您希望或document('details.xml', .)
使用document('details.xml', /)
主输入文档中的节点作为从而不是样式表文档推断基本 URI。
推荐阅读
- java - JRJC 的事件监听器?
- android - Flutter 小部件未在通知单击时呈现
- python-3.x - 如果嵌套列表在索引处包含数字,则删除嵌套列表
- sql - 如何从 Redshift/SQL 中的 json 字符串字段中解析检索值
- python - 消除这两个功能之间的冗余?
- php - 在优惠券设置中添加一个字段并在 Woocommerce 管理订单列表中显示该值
- gcc - .rodata 中字符串对齐和填充的混淆
- html - 子菜单的水平滚动动作
- typescript - 是否可以在打字稿中将文字类型从类型级别转换为术语级别?
- sql - 如何使用条件对 SQL 查询进行排序?