首页 > 解决方案 > 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目录中?

标签: xmlxsltsaxon

解决方案


document函数https://www.w3.org/TR/xslt20/#document有第二个参数,用于提供/推断用于解析第一个参数的基本 URI,因此您希望或document('details.xml', .)使用document('details.xml', /)主输入文档中的节点作为从而不是样式表文档推断基本 URI。


推荐阅读