通过@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
元素的文本内容。 “寻找我?”
嗯,该模板仅用于由Surender提供的输入XML,它只有一个'a'作为根节点。 :) –
我知道。这就是我想说的。您的解决方案并不真正检查'a'元素是否具有后代'c'元素。相反,它检查是否有'c'元素_at all_。 –