我有以下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) < 2">
<xsl:value-of select="/pages/page[0]" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="/pages/page[position() > 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
答案 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) < 2">
<xsl:value-of select="/pages/page[0]" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="/pages/page[position() > 2]" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>