获取最远的祖先节点 -Xpath, XSLT

Posted

技术标签:

【中文标题】获取最远的祖先节点 -Xpath, XSLT【英文标题】:Get most distant ancestor node -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 属性值

【问题讨论】:

【参考方案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>

【讨论】:

以上是关于获取最远的祖先节点 -Xpath, XSLT的主要内容,如果未能解决你的问题,请参考以下文章

获取父节点 XSLT 的属性

使用 xslt 在 X 位置获取节点值

如何从特定节点获取树祖先列表?

如何获取通用java树中所有祖先的列表

通过使用 LINQ 指定祖先节点从节点获取所有属性值

使用 local-name() 获取 XSLT 中的第一个子节点