如何根据choose-when条件将节点集存储在变量中

时间:2011-03-18 14:49:15

标签: xml xslt

我有以下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 个答案:

答案 0 :(得分:3)

使用

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

答案 1 :(得分:0)

首先,definition将此position() = 0设为假。

其次,如果你想要某种分区,其中第二个作为枢轴,请使用

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

注意:如果没有秒,则不会是第三个......

答案 2 :(得分:0)

通过应用依赖于处理器的函数,可以将像valid_pages变量这样的结果树片段转换为节点集。像Saxon9he这样的XSLT 2.0处理器不需要这样,因为在2.0版本中,RTF会被自动解释为节点集,但对于像您正在使用的MSXML 6.0这样的XSLT 1.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>