1
我有一個XML文檔的結構那樣:如何檢索元素祖先,從根元素推算?
<?xml version="1.0"?>
<MPM>
<MPMEntry>
<title>Title 1</title>
<MPMEntry>
<!-- Nest any number of MPMEntry ... -->
<title>Title 1.1</title>
<MPMEntry>
<!-- Nest any number of MPMEntry ... -->
<title>Title 1.1.1</title>
<MPMEntry>
<title>Title 1.1.1.1</title>
<DM id="dm_1111a">
<title>DM title a</title>
<para>and so on</para>
</DM>
<DM id="dm_1111b">
<title>DM title b</title>
<para>and so on</para>
</DM>
</MPMEntry>
</MPMEntry>
</MPMEntry>
<MPMEntry>
<title>Title 1.2</title>
<MPMEntry>
<title>Title 1.2.1</title>
<MPMEntry>
<title>Title 1.2.1.1</title>
<DM id="dm_1211">
<title>DM title m</title>
<para>and so on</para>
</DM>
</MPMEntry>
</MPMEntry>
</MPMEntry>
</MPMEntry>
<MPMEntry>
<title>Title 3</title>
</MPMEntry>
<!-- ... and so on ... -->
</MPM>
的<MPMEntry>
s時,可以疊瓦狀多次要求,取決於作家的意志。
當我處理給定的DM元素(它是XML結構的末端級別)時,我需要能夠檢索第一級和第二級(從XML文檔的根目錄)標題是嵌套在。
也就是說,對於<DM id="dm_1111a">
,我需要找回標題1和標題1.1。對於<DM id="dm_1111a">
,我將需要檢索標題1和標題1.2。
就目前而言,我使用以下XPath(1.0)的表達式,它工作:
- 用於第一
<MPMEntry>
:ancestor::MPMEntry[parent::MPM]/title
- 用於第二
<MPMEntry>
:ancestor::MPMEntry[parent::MPMEntry/parent::MPM]/title
這裏是一個簡單的XSL樣式表(看它在http://xsltransform.net/gWvjQf9上工作):
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="MPM">
<xsl:copy>
<xsl:apply-templates select="descendant::DM" />
</xsl:copy>
</xsl:template>
<xsl:template match="DM">
<Level1Title>
<xsl:value-of select="ancestor::MPMEntry[parent::MPM]/title" />
</Level1Title>
<Level2Title>
<xsl:value-of select="ancestor::MPMEntry[parent::MPMEntry/parent::MPM]/title" />
</Level2Title>
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
我的問題是:是否有更簡單或更直接的方式來檢索所需的信息?是否有一個更通用的可能性來做到這一點(我很可能需要獲得第三級,等等) - 如果可能的話用數字索引,告訴我從根元素中獲得第n級的<MPMEntry>
?
請注意,我需要使用XPath 1.0。