2011-03-18 70 views
2

我有以下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"/> 

我想存储/页/页基于以下条件

<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> 
现在

当我使用

变量0
<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

+0

好问题,+1。查看我的答案,获取简短的一行XPath表达式解决方案。 :) – 2011-03-18 16:04:26

回答

3

使用

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

首先,这position() = 0definition假的。

第二,如果你想要某种与第二为支点分区,使用

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

注意:如果没有第二个,它不会是第三个......

0

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到节点集函数,我知道的是Xalan-J或-C的xalan:nodeset()

不要忘了在样式表的根元素的命名空间声明:
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>