xsl if和xsl foreach元素值的位置

时间:2010-09-12 12:02:59

标签: xslt xpath

这是我的xml:

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

我想问:那告诉我是否存在但是我想要真正的答案onky如果b exsit并且他有t = 1

2 个答案:

答案 0 :(得分:1)

您正在寻找的测试是

//b/t[text() = '1']

此测试现在可以在template中用作匹配项,在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>

注意:

  • 此帖子基于您从根级别查询并且不知道b / t组合在哪里的假设。如果您从层次结构中更深层次的查询或确切知道b / t组合的路径,可能希望 替换{ {1}}使用更合适的以避免效率低下
  • 另请注意,//函数连接所有后代节点的文本内容,即如果您可以确定没有其他后代,则仅以上述方式使用它。 text()node-test返回上下文节点下的所有文本节点。 (马丁,谢谢你指出这一点)。

答案 1 :(得分:1)

使用

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

根据提供的XML文档进行评估时,结果为:

true()

请记住始终尝试避免使用//缩写,因为这会导致遍历上下文节点的整个(子)树的极低效率遍历。