2015-11-10 43 views
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。

回答

1

您可以在祖輩軸使用位置謂詞,記住,這是一個反向軸:

<Level1Title> 
    <xsl:value-of select="ancestor::MPMEntry[last()]/title" /> 
</Level1Title> 
<Level2Title> 
    <xsl:value-of select="ancestor::MPMEntry[last() - 1]/title" /> 
</Level2Title> 
相關問題