2014-02-11 188 views
0

我一直在试图检查一个特定的节点是否包含其中的另一个节点,不一定是它的孩子,而是作为它的孩子的孩子等等。XSLT测试XML节点是否包含另一个XML节点?

例如:

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

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

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

我想在每个a的环境中使用//c的,但不会是所有选择中的XML,而不是特定的a里面的一个c节点?如果是的话,任何人都可以建议我做一个方法吗?

Thnx提前!

回答

4

通过@Lingamurthy CS给出的答案是错的。 //c在输入XML中找到c元素任何地方

而是使用:

<xsl:template match="a[descendant::c]"> 
其中 a元素相匹配

,如果它有一个后代元素c

为了证明这一点,假设以下XML输入。有一个c元素,但它不是a的后代。

输入XML(修改)

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <a> 
    </a> 
    <c>wrong</c> 
    <a> 
     <b> 
     </b> 
    </a> 
</root> 

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

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

正如你所看到的,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> 

应用于相同输入I以上描述,结果在

输出(使用descendant::c

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


    wrong 

否输出yes元素。由于XSLT处理器的默认行为,只输出c元素的文本内容。 “寻找我?”

+0

嗯,该模板仅用于由Surender提供的输入XML,它只有一个'a'作为根节点。 :) –

+0

我知道。这就是我想说的。您的解决方案并不真正检查'a'元素是否具有后代'c'元素。相反,它检查是否有'c'元素_at all_。 –

0

使用 '//' 跳过儿童水平的任意数:

//a//c 
+0

只是一个示例文本。它不存在于实际的XML中。 –

+0

@SurenderThakran,然后不要将其包含在搜索模式中(请参阅我的上一次编辑) – spektom

相关问题