【问题标题】:Get most distant ancestor node -Xpath, XSLT获取最远的祖先节点 -Xpath, XSLT
【发布时间】:2017-02-17 09:32:28
【问题描述】:

我有一个这样的xml,

<doc>
    <chap>
        <sec originator="ABC">
            <app originator="body">
                <sec originator="body">
                    <p>text</p>
                </sec>
            </app>
        </sec>
    </chap>
    <chap>
        <chap>
            <app originator="DEF">
                <sec originator="body">
                    <sec>
                        <p>text2</p>
                    </sec>
                </sec>
            </app>
        </chap>
    </chap>
    <sec originator="GHI">
        <sec originator="body">
            <p>text</p>
        </sec>
    </sec>
    <app originator="KLM">
        <sec>
            <sec>
                <p>text2</p>
            </sec>
        </sec>
    </app>
</doc>

我已经为&lt;p&gt; 节点编写了模板,我需要从中获取最远距离的祖先&lt;sec&gt;&lt;app&gt; 节点originator 属性值。

我的 xpath 是

//p/(ancestor::app[@originator][last()] | ancestor::sec[@originator][last()])/@originator

这将选择originator属性值ABC, body, DEF, body, GHI, KLM..但我需要的是ABC, DEF, GHI, KLM

如何更改我的 xpath 以获得最大距离 &lt;sec&gt;&lt;app&gt; 节点 originator 属性值

【问题讨论】:

    标签: xml xslt xpath xslt-2.0


    【解决方案1】:

    p 元素的上下文中,您可以选择ancestor::*[self::app[@originator] | self::sec[@originator]][last()]/@originator,参见http://xsltransform.net/bFWR5EQ

    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    
    
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="p">
            <p orig="{ancestor::*[self::app[@originator] | self::sec[@originator]][last()]/@originator}">
                <xsl:apply-templates/>
            </p>
        </xsl:template>
    </xsl:transform>
    

    给予

    <?xml version="1.0" encoding="UTF-8"?><doc>
        <chap>
            <sec originator="ABC">
                <app originator="body">
                    <sec originator="body">
                        <p orig="ABC">text</p>
                    </sec>
                </app>
            </sec>
        </chap>
        <chap>
            <chap>
                <app originator="DEF">
                    <sec originator="body">
                        <sec>
                            <p orig="DEF">text2</p>
                        </sec>
                    </sec>
                </app>
            </chap>
        </chap>
        <sec originator="GHI">
            <sec originator="body">
                <p orig="GHI">text</p>
            </sec>
        </sec>
        <app originator="KLM">
            <sec>
                <sec>
                    <p orig="KLM">text2</p>
                </sec>
            </sec>
        </app>
    </doc>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-10
      • 2011-08-26
      • 1970-01-01
      • 2020-01-09
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多