Автоматизация exslt:node-set?
Не уверен, что это возможно, но пытаясь настроить что-то, что не заставляет меня набирать exslt: node-set при извлечении значений из динамически создаваемого блока узлов. Я храню весь набор узлов в переменной и заключаю их в exslt: node-set, но почему это не работает, когда я пытаюсь извлечь из него. Это возможно?
<xsl:variable name="LANG">
<xsl:variable name="tmp">
<xsl:element name="foo">
<xsl:element name="bar">Hello</xsl:element>
</xsl:element>
</xsl:variable>
<xsl:value-of select="exslt:node-set($tmp)"/>
</xsl:variable>
<!-- Love to be able to do this -->
<xsl:value-of select="$LANG/foo/bar"/>
<!-- This does work -->
<xsl:value-of select="exslt:node-set($LANG)/foo/bar"/>
1 ответ
В XSLT 1.0 переменные, определенные как в вашем примере, называются фрагментами дерева результатов (RTF), и вы можете использовать только xsl:copy-of
скопировать весь фрагмент в дерево результатов или xsl:value-of
скопировать весь контент. пример
<xsl:copy-of select="$LANG"/>
Если вы хотите рассматривать переменную как временное дерево, вам нужно node-set()
расширение.
Обычный способ работы со статическими фрагментами дерева (такими как таблицы поиска) в XSLT 1.0 - определить их как дочерние элементы корневых элементов таблицы стилей (используя пользовательское пространство имен). Тогда вы можете использовать document()
функция для извлечения искомого значения.
Примечание. Если вы используете Saxon (v>6.5), вы можете просто установить версию таблицы стилей на 1.1, и вы сможете управлять RTF без какого-либо расширения набора узлов.
[XSLT 1.0]
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:empo="http://stackru.com/users/253811/empo">
<empo:LANG>
<empo:foo>
<empo:bar>Hello</empo:bar>
</empo:foo>
</empo:LANG>
<xsl:template match="/">
<xsl:variable name="LANG" select="document('')/*/empo:LANG"/>
<xsl:value-of select="$LANG/empo:foo/empo:bar"/>
</xsl:template>
</xsl:stylesheet>