2010-09-12 38 views
2

这是我的xml:XSL如果和XSL的foreach其中元素值是

<root> 
<a> 
    <b> 
    <t>1</t> 
    </b> 
    <b> 
    <t>2</t> 
    </b> 
</a> 
</root> 

我要问:这就是告诉我,如果任意t存在,但我想真正的答案onky。如果B exsit和他有T = 1辆

坦克

+0

好问题(+1)。看到我的答案是一个简短而有效的解决方案。 :) – 2010-09-12 20:10:59

回答

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> 

注:

  • 这篇文章是基于您查询asumption从根级不知道b/t组合在哪里是。如果从一个点查询更深层次或确切地知道路径到B/T组合, 可能要 应该 更合适避免低效东西代替//
  • 另请注意, text()函数连接了所有后代节点的文本内容,即只有在确定没有其他后代的情况下才按照上述方式使用它。 text()节点测试返回上下文节点下的所有文本节点。 (马丁,感谢你指出了这一点)。
+3

Obalix,你为什么说“text()函数连接所有后代节点的文本内容”?这是不正确的。在XPath表达式中,// b/t [text()='1']'如果方括号中至少有一个文本子节点的内容为“1”,则对于“t”元素为真。如果你使用'// b/t [。 ='1'],则将“t”元素的字符串值与“1”进行比较,字符串值是所有文本节点后代的连接。 – 2010-09-12 14:02:58

+1

1.在XPath表达式中使用'//'缩写会导致效率显着下降。 2.为什么你提供了语法上非法的XSLT代码? – 2010-09-12 20:13:39

+0

@Dimitre Novatchev:For 1 .:同意,看我的笔记; 2:出于愚蠢,对不起,更正了样品。 – AxelEckenberger 2010-09-13 10:50:29

1

使用

boolean(/*/*/b[t=1]) 

当对所提供的XML文档进行评估,其结果是:

true() 

记住总是尽量避免//缩写,因为它会导致以上下文节点为根的整个(子)树的极其低效的遍历。