获取最远的祖先节点 -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>
我已经为<p>
节点编写了模板,我需要从中获取最远距离的祖先<sec>
或<app>
节点originator
属性值。
我的 xpath 是
//p/(ancestor::app[@originator][last()] | ancestor::sec[@originator][last()])/@originator
这将选择originator
属性值ABC, body, DEF, body, GHI, KLM
..但我需要的是ABC, DEF, GHI, KLM
。
如何更改我的 xpath 以获得最大距离 <sec>
或 <app>
节点 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的主要内容,如果未能解决你的问题,请参考以下文章