我想知道是否有任何方法可以使用Xpath访问公共父节点.
<outer> <main> <a><b> sometext </b></a> <c><d> sometext2 </d></c> </main> </outer>
我有文本节点sometext和sometext2.有没有办法可以访问这两个节点的主(共同父节点)?我不知道包含这些节点的xml的布局.
任何帮助表示赞赏..
谢谢
RP
使用以下XPath 1.0表达式:
$v1/ancestor::* [count(. | $v2/ancestor::*) = count($v2/ancestor::*) ] [1]
其中$v1和$v2包含两个文本节点(如果您不在XSLT中使用XPath,则必须使用选择这两个文本节点中的每一个的XPath表达式替换上述表达式中的$v1和$v2).
说明:
上面的XPath 1.0表达式找到两个节点集的交集:$v1的所有元素祖先的节点集和$v2的所有元素祖先的节点集.这是通过所谓的Kaysian交叉方法完成的(在2000年发现这一点的Michael Kay之后).使用Kaysian方法进行交集,通过以下XPath表达式选择两个节点集$ns1和$ns2的交集:
$ns1[count(. | $ns2) = count($ns2)]
然后,从祖先的交叉点,我们必须选择最后一个元素.但是,因为我们使用反向轴(祖先),所需的节点位置必须表示为1.
通过应用以下转换,可以快速验证上述XPath表达式是否真正选择了最低共同祖先:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:variable name="v1" select="/*/*/a/b/text()"/> <xsl:variable name="v2" select="/*/*/c/d/text()"/> <xsl:variable name="vCommonAncestor" select= "$v1/ancestor::* [count(. | $v2/ancestor::*) = count($v2/ancestor::*) ] [1]" /> <xsl:template match="/"> <xsl:value-of select="name($vCommonAncestor)"/> </xsl:template> </xsl:stylesheet>
当应用于最初提供的XML文档(更正为格式良好的XML)时:
<outer> <main> <a> <b>sometext</b> </a> <c> <d>sometext2</d> </c> </main> </outer>
主要
选择两个节点的最低共同祖先的XPath 2.0表达式更简单,因为它使用标准XPath 2.0运算符“intersect”:
($v1/ancestor::* intersect $v2/ancestor::*) [last()]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。