Автоматизация exslt: node-set? - PullRequest
2 голосов
/ 27 июля 2011

Не уверен, что это возможно, но при попытке настроить что-то, что не заставляет меня набирать 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 Ответ

2 голосов
/ 27 июля 2011

В XSLT 1.0 переменная, определенная, как в вашем примере, называется фрагментами дерева результатов (RTF), и вы можете использовать xsl:copy-of только для копирования всего фрагмента в дерево результатов или xsl:value-of дляскопируйте весь контент.Пример

 <xsl:copy-of select="$LANG"/>

Если вы хотите обрабатывать переменную как временное дерево, вам нужно расширение node-set().

Обычный способ работы со статическими фрагментами дерева (такими как таблицы поиска) в XSLT1.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://stackoverflow.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>
...