Saxon XSL转换的查找目录

时间:2018-07-04 17:57:50

标签: xml xslt saxon

我有两个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'))来找到merge.xsl

  

在xsl:if / @ test的char 9处警告,在merge.xsl的第13行第77列:
    FODC0002:XML解析器处理报告的I / O错误
    文件:/xsl/details.xml:
    /xsl/details.xml(无此文件或目录)

如果我将merge.xsl放在同一目录中,则可以正常工作,并且可以按预期合并两个xml文件,但是不可能每次都手动进行。

是否可以配置Saxon转换器以从xml中的document('file.xml')文件中查找与这些文档位于同一目录中的文件,而不是位于xsl目录中?

1 个答案:

答案 0 :(得分:1)

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