Функция документа XSLT ('') не работает

Как я понял из документов, функция XSLT document() с пустой строкой в ​​качестве параметра должна читать текущий документ XSLT. Но следующий код не работает:

  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <state>test2</state>
   <xsl:template match="/">
      test1
      <xsl:value-of select="document('')/*/state"/>
    </xsl:template>
   </xsl:stylesheet>

Когда я применяю этот XSLT к какому-либо XML (только для примера), я получаю только "test1" в качестве вывода. Почему линия

 <xsl:value-of select="document('')/*/state"/>

не печатает "test2"?

2 ответа

Решение

Определение документа ('') состоит в том, что он читает документ XML, URI которого совпадает с базовым URI инструкции в таблице стилей, содержащей вызов документа (''). Если вы не используете внешние объекты, это обычно совпадает с базовым URI модуля таблицы стилей. Если это не работает, это часто потому, что базовый URI модуля таблицы стилей неизвестен. Это может легко произойти, если процессору XSLT предоставляется таблица стилей, которая находится в памяти (например, в виде строки символов или DOM), а не ресурс, извлекаемый через URI. Например, если вы используете JAXP StreamSource и не вызываете setSystemId(), тогда базовый URI будет неизвестен.

Вы должны объявить свое собственное пространство имен, например так:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:my="http://localhost"
    exclude-result-prefixes="my">
    <xsl:output method="text"/>

    <my:state>test2</my:state>

    <xsl:template match="/">
        <xsl:text>test1</xsl:text>
        <xsl:value-of select="document('')/*/my:state"/>
    </xsl:template>
</xsl:stylesheet>

Ouput:

test1test2

Цитирую Майкла Кея:

Определяемый пользователем элемент верхнего уровня также должен принадлежать пространству имен с ненулевым URI, отличным от пространства имен XSLT и предпочтительно отличающимся от URI пространства имен, используемого любым поставщиком. Эти элементы игнорируются процессором XSLT.

Другие вопросы по тегам