Каталог поиска для саксонского XSL-преобразования - PullRequest
0 голосов
/ 04 июля 2018

У меня есть два 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 - по относительному пути. Для их преобразования я использую саксонскую банку: java -jar /jars/saxon.jar -s:items.xml -xsl:/xsl/merge.xsl но он показывает предупреждение и не может найти details.xml по относительному пути (document('details.xml') в merge.xsl):

Предупреждение для символа 9 в xsl: if / @ test в строке 13 столбца 77 файла merge.xsl:
FODC0002: ошибка ввода-вывода при обработке синтаксического анализатора XML
Файл: /xsl/details.xml:
/xsl/details.xml (нет такого файла или каталога)

Если я помещу merge.xsl в один каталог, он будет работать нормально и объединит оба xml файла, как и ожидалось, но это невозможно сделать каждый раз вручную.

Можно ли настроить преобразователь Saxon для поиска xml файлов из document('file.xml') в том же каталоге, в котором находятся эти документы, а не в каталоге xsl?

1 Ответ

0 голосов
/ 04 июля 2018

Функция document https://www.w3.org/TR/xslt20/#document имеет второй параметр для предоставления / вывода базового URI для разрешения первого аргумента, поэтому вы хотите, чтобы document('details.xml', .) или document('details.xml', /) использовали узел из основного входного документа в качестве тот, который выводит базовый URI, а не документ таблицы стилей.

...