首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在XPath树中具有属性的XML1.0最近的前导节点和/或祖先节点

在XPath树中具有属性的XML1.0最近的前导节点和/或祖先节点
EN

Stack Overflow用户
提问于 2011-07-02 07:16:07
回答 2查看 32.6K关注 0票数 22

下面是三个XML树

(1)

代码语言:javascript
复制
<?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/> <!-- here's the bookmark-->
                <section id="6">
                    <section id="7">
                        <section id="8"/>
                    </section>
               </section>
            </section>
        </section>
    </section>
</content>

(2)

代码语言:javascript
复制
<?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/> <!-- here's the bookmark-->
        <section id="6">
            <section id="7">
                <section id="8"/>
            </section>
        </section>
    </section>
</content>

在这两种情况下,期望的结果都是id 5

使用XSLT1.0和XPath 1.0,我可以从(1)获得祖先

代码语言:javascript
复制
<xsl:value-of select="//bookmark/ancestor::*[@id][1]/@id"/>

或(2)中的前一个节点

代码语言:javascript
复制
<xsl:value-of select="//bookmark/preceding::*[@id][1]/@id"/>

如何从我的书签中获得具有id的最近的祖先之前的节点?

我需要一个xsl:value-它的两个大小写都匹配。谢谢。

编辑:

该解决方案还应涵盖此结构。所需的id仍为5

(3)

代码语言:javascript
复制
<?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/> <!-- here's the bookmark-->
                <section id="6">
                    <section id="7">
                        <section id="8"/>
                    </section>
                </section>
            </section>
        </section>
    </section>
</content>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-02 10:29:36

使用的

代码语言:javascript
复制
    (//bookmark/ancestor::*[@id][1]/@id 
| 
    //bookmark/preceding::*[@id][1]/@id
     )
     [last()]

验证:使用XSLT作为XPath的宿主,进行以下转换:

代码语言:javascript
复制
<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文档中的任何一个应用时,都会生成所需的、正确的结果。

5

我强烈建议使用 播放/学习XPath

票数 26
EN

Stack Overflow用户

发布于 2011-07-02 07:23:55

尝试使用:

代码语言:javascript
复制
<xsl:value-of 
    select="//bookmark/ancestor::*[1]/descendant-or-self::*[last()-1]/@id"/>

它为这两个XML文档返回5

编辑:

在这种情况下,您可以使用简单的xsl:choose

代码语言:javascript
复制
<xsl:variable name="lastSibling"
    select="//bookmark/preceding-sibling::*[1]"/>
<xsl:choose>
    <xsl:when test="$lastSibling">
        <xsl:value-of
            select="$lastSibling/descendant-or-self::*[last()]/@id"/>
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="//bookmark/ancestor::*[@id][1]/@id"/>
    </xsl:otherwise>
</xsl:choose>

另一种通用解决方案:

代码语言:javascript
复制
<xsl:for-each
    select="//section[following::bookmark or descendant::bookmark][@id]">
    <xsl:if test="position() = last()">
        <xsl:value-of select="./@id"/>
    </xsl:if>
</xsl:for-each>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6554067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档