是否可以在for-each循环中添加一个条件,这样如果一个属性值与预定义变量匹配,则选择满足条件的项,否则匹配所有项。
例如,我有如下2个输入XML:
<root>
<a value="z">
<b value="y">
<c value="x">
<var1>someData</var1>
<var2>someOtherData</var2>
</c>
<c value="x2">
<var1>someData</var1>
<var2>someOtherData</var2>
</c>
</b>
</a>
<a value="w">
<b value="v">
<c value="u">
<var1>someData2</var1>
<var2>someOtherData2</var2>
</c>
<c value="u2">
<var1>someData2</var1>
<var2>someOtherData2</var2>
</c>
</b>
</a>
</root>
除<root>
外,每个元素可以重复n次,通过属性值来识别。
和第二个输入xml,如:
<filter>
<aValue>z</aValue>
<bValue>y</bValue>
<cValue></cValue>
</filter>
可以使用for-each循环遍历元素,例如
<xsl:for-each select="/root/a" >
...
</xsl:for-each>
或者有选择地定义属性值:
<xsl:for-each select="/root/a[@value='z']" >
...
</xsl:for-each>
第二个输入XML并不总是包含每个元素的过滤器值。如果这个元素不包含值,我需要匹配所有元素。是否有比在<xsl:if>
语句中嵌套每个元素过滤器更干净的解决方案?
我可以使用xslt 1.0或2.0
如果您将变量$required
绑定到提供的所需值,或者绑定到"*"否则,您可以使用谓词
[@value = $required or $required = "*"]
在2.0中,您可以将其写成[(@value, "*") = $required]
。
当然可以使用其他值而不是"*"表示"一切顺利"。例如"。或者在2.0中,使用空序列是很自然的,在这种情况下,谓词条件变为简单的[@value = $required]
,因为如果$required
为空,这将始终为假。