Как сохранить набор узлов в переменной на основе условия выбора - PullRequest
2 голосов
/ 18 марта 2011

У меня следующая структура XML

<pages>
    <page id="8992" filename="news7" extension=".aspx" title="News 7"
          real="True" virtual="False" visible="True" day="18" month="3"
          year="2010" />
    <page id="8991" filename="news6" extension=".aspx" title="News 6"
          real="True" virtual="False" visible="True" day="18" month="3"
          year="2010" />
    <page id="8990" filename="news5" extension=".aspx" title="News 5"
          real="True" virtual="False" visible="True" day="18" month="3"
          year="2010" />
    <page id="8883" filename="news2" extension=".aspx" title="News 2"
          real="True" virtual="False" visible="True" day="15" month="2"
          year="2010" />
    <page id="8989" filename="news4" extension=".aspx" title="News 4"
          real="True" virtual="False" visible="True" day="18" month="3"
          year="2009" />
</pages>

Теперь есть переменная

<xsl:variable name="valid_pages"/>

Я хочу сохранить / pages / page в переменной на основании следующих условий

<xsl:variable name="valid_pages">
    <xsl:when test="count(/pages/page) &lt; 2">
        <xsl:value-of select="/pages/page[0]" />
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="/pages/page[position() &gt; 2]" />
    </xsl:otherwise>
</xsl:variable>

теперь, когда я использую

<xsl:value-of select="count($valid_pages)" />

Я получаю ошибку

To use a result tree fragment in a path expression, first convert it to a node-set using the msxsl:node-set() function

Ответы [ 3 ]

3 голосов
/ 18 марта 2011

Использование :

<xsl:variable name="valid_pages" select=
"/pages/page[not(/pages/page[2])]
|
 /pages/page[position() > 2][/pages/page[2]]
"/>
0 голосов
/ 25 марта 2012

Фрагменты дерева результатов, такие как переменная valid_pages, можно преобразовать в набор узлов, применяя зависимую от процессора функцию.Процессорам XSLT 2.0, таким как Saxon9he, это не понадобится, поскольку в 2.0 RTF автоматически интерпретируются как наборы узлов, но для процессоров XSLT 1.0, таких как MSXML 6.0, которые вы, похоже, используете, будет работать следующее:

<xsl:value-of select="count(msxsl:node-set($valid_pages))" />

Еще одна известная мне функция RTF to nodeset - xalan:nodeset() для Xalan-J или -C.

Не забудьте включить объявление пространства имен в корневой элемент таблицы стилей:
xmlns:msxsl="urn:schemas-microsoft-com:xslt" или
xmlns:xalan="http://xml.apache.org/xalan"

Кстати, объявление переменной valid_pages неверно;не смотря на значимость и полезность вообще, это должно быть написано по крайней мере, включая xsl:choose следующим образом:

<xsl:variable name="valid_pages">
    <xsl:choose>
        <xsl:when test="count(/pages/page) &lt; 2">
            <xsl:value-of select="/pages/page[0]" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="/pages/page[position() &gt; 2]" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>
0 голосов
/ 18 марта 2011

Во-первых, это position() = 0 неверно по определению .

Во-вторых, если вы хотите какой-то раздел с секундой в качестве оси вращения, используйте

<xsl:variable name="valid_pages" 
              select="/pages/page[not(/pages/page[2])] |
                      /pages/page[position() > 2]"/>

Примечание : Если нет секунды, она не будет третьей ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...