这里有三个XML树
(1)
<?xml version="1.0" encoding="UTF-8"?> <content> <section id="1"> <section id="2"/> <section id="3"/> <section id="9"/> </section> <section id="4"> <section id="5"> <section> <bookmark/> <section id="6"> <section id="7"> <section id="8"/> </section> </section> </section> </section> </section> </content>
(2)
<?xml version="1.0" encoding="UTF-8"?> <content> <section id="1"/> <section id="2"> <section id="9"> <section id="10"> <section id="11"/> </section> </section> <section> <section id="4"> <section id="5"/> </section> </section> <section/> <bookmark/> <section id="6"> <section id="7"> <section id="8"/> </section> </section> </section> </content>
在所有情况下,所需的结果为id 5。
使用XSLT 1.0和XPath 1.0,我可以从(1)
<xsl:value-of select="//bookmark/ancestor::*[@id][1]/@id"/>
或来自(2)的前一节点
<xsl:value-of select="//bookmark/preceding::*[@id][1]/@id"/>
如何从我的书签获取最近的祖先或前一个节点的ID?
我需要一个单一的xsl:值,它们匹配两种情况。谢谢。
编辑:
解决方案也应该涵盖这一结构。所需ID仍然是5。
(3)
<?xml version="1.0" encoding="UTF-8"?> <content> <section id="1"> <section id="2"/> <section id="3"/> <section id="9"/> </section> <section id="4"> <section> <section id="10"/> <section id="5"/> <section> <bookmark/> <section id="6"> <section id="7"> <section id="8"/> </section> </section> </section> </section> </section> </content>
使用:
(//bookmark/ancestor::*[@id][1]/@id | //bookmark/preceding::*[@id][1]/@id ) [last()]
验证:使用XSLT作为XPath的主机,进行以下转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="/"> <xsl:value-of select= "(//bookmark/ancestor::*[@id][1]/@id | //bookmark/preceding::*[@id][1]/@id ) [last()]"/> </xsl:template> </xsl:stylesheet>
当应用于任何提供的三个XML文档时,会产生所需的正确结果:
五
我强烈推荐使用XPath Visualizer播放/学习XPath。