我一直在尝试检查某个特定节点是否包含其中的另一个节点,不一定是其子节点,而是作为其子节点的子节点等等。
例如:
<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提前!!
答案 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