这是我的xml:XSL如果和XSL的foreach其中元素值是
<root>
<a>
<b>
<t>1</t>
</b>
<b>
<t>2</t>
</b>
</a>
</root>
我要问:这就是告诉我,如果任意t存在,但我想真正的答案onky。如果B exsit和他有T = 1辆
坦克
这是我的xml:XSL如果和XSL的foreach其中元素值是
<root>
<a>
<b>
<t>1</t>
</b>
<b>
<t>2</t>
</b>
</a>
</root>
我要问:这就是告诉我,如果任意t存在,但我想真正的答案onky。如果B exsit和他有T = 1辆
坦克
你要找的测试
//b/t[text() = '1']
该测试现在可以在使用的比赛,在for-each
环路作为选择或在if
语句作为测试 - 例如:
<xsl:template match="//b/t[text() = '1']">
<!-- all t children of b with a content of 1 -->
</xsl:template>
<xsl:for-each select="//b/t[text() = '1']">
<!-- all t children of b with a content of 1 -->
</xsl:for-each>
<xsl:if test="//b/t[text() = '1']">
<!-- This is the true case -->
</xsl:if>
注:
//
。text()
函数连接了所有后代节点的文本内容,即只有在确定没有其他后代的情况下才按照上述方式使用它。
Obalix,你为什么说“text()函数连接所有后代节点的文本内容”?这是不正确的。在XPath表达式中,// b/t [text()='1']'如果方括号中至少有一个文本子节点的内容为“1”,则对于“t”元素为真。如果你使用'// b/t [。 ='1'],则将“t”元素的字符串值与“1”进行比较,字符串值是所有文本节点后代的连接。 – 2010-09-12 14:02:58
1.在XPath表达式中使用'//'缩写会导致效率显着下降。 2.为什么你提供了语法上非法的XSLT代码? – 2010-09-12 20:13:39
@Dimitre Novatchev:For 1 .:同意,看我的笔记; 2:出于愚蠢,对不起,更正了样品。 – AxelEckenberger 2010-09-13 10:50:29
使用:
boolean(/*/*/b[t=1])
当对所提供的XML文档进行评估,其结果是:
true()
记住:总是尽量避免//
缩写,因为它会导致以上下文节点为根的整个(子)树的极其低效的遍历。
好问题(+1)。看到我的答案是一个简短而有效的解决方案。 :) – 2010-09-12 20:10:59