XSLT测试XML节点是否包含另一个XML节点?

时间:2014-02-11 06:40:37

标签: xml xslt xpath

我一直在尝试检查某个特定节点是否包含其中的另一个节点,不一定是其子节点,而是作为其子节点的子节点等等。

例如:

<a>
    <c> looking for me?</c>
</a>

<a>
    <b>
        <c>looking for me?</c>
    </b>
</a>

在上述情况下,我正在寻找一个包含a节点的c节点。 在上述两种情况下,测试都应该通过,因为两个a节点都包含c节点。

我想在每个//c的上下文中使用a,但是不会选择XML中的所有c节点而不是特定{{1}内的节点}?如果是的话,有人可以建议我这样做吗?

Thnx提前!!

2 个答案:

答案 0 :(得分:4)

@Lingamurthy CS给出的答案是错误的。 //c在输入XML中找到c元素 where

改为使用:

<xsl:template match="a[descendant::c]">

如果a元素具有后代元素c,则匹配c元素。

为了证明这一点,假设以下XML输入。有一个a元素,但它不是<?xml version="1.0" encoding="utf-8"?> <root> <a> </a> <c>wrong</c> <a> <b> </b> </a> </root> 的后代。

输入XML (已修改)

<?xml version="1.0" encoding="UTF-8"?>
   <yes/>
   wrong
   <yes/>

输出(使用@Lingamurthy CS'模板)

test="exists(//c)"

正如您所看到的,yes在两种情况下都评估为“真实” - 这是错误的。不应输出<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="a[descendant::c]"> <yes/> </xsl:template> </xsl:stylesheet> 个元素。

另一方面,使用:

<强>样式表

descendant::c

应用于我上面描述的相同输入,结果为

输出(使用<?xml version="1.0" encoding="UTF-8"?> wrong

yes

不输出c个元素。由于XSLT处理器的默认行为,仅输出{{1}}元素的文本内容。

答案 1 :(得分:0)

使用'//'跳过任意数量的子级别:

//a//c