Pet*_*son 17 xslt .net-1.1 xpath
我需要能够在变量中存储节点集,然后在其上执行更多的过滤/排序.我看到的所有这些例子都涉及使用XSL2或扩展,这两者都不是真正的选择.
我的XML文档中的酒店列表可以进行排序/过滤,然后一次分页5个.我发现虽然我正在重复很多逻辑,因为目前我还没有找到在xsl变量中存储节点集的好方法,然后在它们上使用xpath进行进一步的过滤/排序.
这就是我所追求的事情(请原谅我头顶的代码所以可能不是100%):
<xsl:variable name="hotels" select="/results/hotels[active='true']" />
<xsl:variable name="3_star_or_less" select="/results/hotels[number(rating) <= 3]" />
<xsl:for-each select="3_star_or_less">
<xsl:sort select="rating" />
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)
有没有人有一个如何最好地做这种事情的例子?
Rub*_*ias 22
试试这个例子:
<xsl:variable name="hotels" select="/results/hotels[active='true']" />
<xsl:variable name="three_star_or_less"
select="$hotels[number(rating) <= 3]" />
<xsl:for-each select="$three_star_or_less">
<xsl:sort select="rating" />
<xsl:value-of select="rating" />
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)
将节点集存储在XSLT 1.0中的变量中没有问题,并且不需要扩展.如果你只是在select属性中使用XPath表达式xsl:variable,那么你最终会做到这一点.
只有当您想要将自己生成的节点存储在变量中时,问题才会出现,即使这样,您也希望稍后再查询它们.这里的问题是你输出的节点没有"node-set"类型 - 相反,它们就是所谓的"结果树片段".您可以将其存储到变量中,然后可以使用该变量将片段插入到输出(或其他变量)中,但不能使用XPath对其进行查询.那时你需要EXSLT node-set()函数(将结果树片段转换为节点集)或XSLT 2.0(其中没有结果树片段,只有节点序列,无论它们来自何处).
对于您给出的示例,这似乎不是问题.鲁本斯的回答给出了确切的语法.
另请注意,如果您希望能够将变量用作XPath语句的一部分,则需要选择变量<xsl:copy-of select="."/>而不是<xsl:value-of select="."/>
value-of将只接受节点的文本,并且您将无法使用节点集函数返回任何有意义的内容.
<xsl:variable name="myStringVar">
<xsl:value-of select="."/>
</xsl:variable>
<!-- This won't work: -->
<Output>
<xsl:value-of select="node-set($myStringVar)/SubNode" />
</Output>
<xsl:variable name="myNodeSetVar">
<xsl:copy-of select="."/>
</xsl:variable>
<!-- This will work: -->
<Output>
<xsl:value-of select="node-set($myNodeSetVar)/SubNode" />
</Output>
Run Code Online (Sandbox Code Playgroud)