我正在尝试设置一个XSL:IF语句,该语句仅显示具有介于两个值之间的节点的条目。很简单吧?它只是一个如果大于,如果小于。问题是,我不需要针对一个节点对其进行测试,而是需要针对最多52个节点进行测试。
假设我有一些看起来像这样的XML:
<container>
<entry>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
<item>6</item>
<item>7</item>
<item>8</item>
<item>9</item>
<item>10</item>
</entry>
</container>
现在说我给了9-15的范围。因为有些节点属于该范围,所以我想显示该条目。但是,如果给出11-15的范围,则没有任何节点适合,所以我不希望它显示出来。
问题是......我完全不知道你会怎么做。我知道你可以使用单个值,但我想不出一个简单的方法来测试每个节点。
顺便说一下,这一切都是在最新的Symphony CMS稳定版本中完成的。
[编辑] 前两个结果的问题是它们显示ITEM节点,我正在寻找的只是返回至少有一个匹配的ITEM节点的ENTRY节点。我不确定任何解决方案对此有何帮助。
答案 0 :(得分:2)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:copy-of select="container/entry/item[number(.) >= 9 and number(.) <= 15]"/>
</xsl:template>
</xsl:stylesheet>
XPath语句'container / entry / item'指的是所有匹配的项目。列表中的谓词[number(。)&gt; = 9和number(。)&lt; = 15]减去了。某些XSLT操作(例如,xsl:value-of)具有仅捕获第一个值的隐含过滤器。在这些情况下,您可以使用xsl:for-each:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:for-each select="container/entry/item[number(.) >= 9 and number(.) < 15]">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:2)
您可以使用<entry>
匹配的嵌套谓词来完成此操作:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:for-each select="container/entry[item[number(.) >= 9 and number(.) <= 15]]">
<!-- this will loop over <entry>s which contain <item>s within your range -->
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
该表达式将读作“包含值在9到15之间的项目的条目”。
答案 2 :(得分:1)
这个怎么样....你可以在for-each循环中做任何你想做的事情,或者你可以只取变量中返回的节点集并在其他地方使用它。
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<!-- Your first param -->
<xsl:param name="Param1" select="4"/>
<!-- Your second param -->
<xsl:param name="Param2" select="9"/>
<xsl:variable name="ResultNodeSet">
<xsl:for-each select="/container/entry/item[number(.) >= $Param1 and number(.) <= $Param2]">
<!-- What ever else you want to do can go here-->
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="$ResultNodeSet"/>
</xsl:template>
</xsl:stylesheet>