XSLT - for-each定义中的If条件



是否可以在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为空,这将始终为假。

最新更新