2011-12-21 72 views
0

這是我的XML文檔(小片段)。如何根據XSLT 2.0中的子元素檢索特定的XML元素?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 

<w:body> 
    <w:p> <!-- Current Node --> 
     <w:r> 
      <w:t> 
       This is the 
      </w:t> 
     </w:r> 
     <w:r> 
      <w:pict> 
       <w:p> 
        <w:r> 
         <w:t> 
          I dont need this 
         </w:t> 
        </w:r> 
       </w:p> 
      </w:pict> 
     </w:r> 

     <w:r> 
      <w:pict> 
       <w:p> 
        <w:r> 
         <w:t> 
          I dont need this too 
         </w:t> 
        </w:r> 
       </w:p> 
      </w:pict> 
     </w:r> 

     <w:r> 
      <w:t> 
       text that i need to retrieve... 
      </w:t> 
     </w:r> 
    </w:p> 
</w:body> 
</w:document> 

在這裏,我想找回<w:r><w:t>價值和<w:r>不應包含在它裏面的孩子<w:pict>。所以,按我上面的XML文檔我想生成以下的輸出:

<paragraph>This is the text that i need to retrieve...</paragraph> 

,這是我的XSLT片段(請告訴我什麼樣的變化這是否XSLT需要得到上面的格式):

<xsl:choose> 
    <xsl:when test="self::w:p[//w:r/w:t[not(ancestor::w:pict)]]"> 

     <Paragraph> 
      <xsl:apply-templates select="./w:t[not(ancestor::w:pict)]" /> 
     </Paragraph> 
    </xsl:when> 
</xsl:choose> 

<xsl:template match="w:t"> 
    <xsl:value-of select="." /> 
</xsl:template> 

但它不工作...

請指導我擺脫這個問題。

+0

文本「我不需要這種」被包含在一個'',''不包含孩子''。你能再澄清一下你的要求嗎?這聽起來像你需要檢查祖先元素,而不是子元素。 – 2011-12-21 08:41:36

+0

@TimC:是的tim.I想要得到的值,其祖先不等於。 – Saravanan 2011-12-21 09:03:39

回答

1

在當前的例子中,如果您當前的節點是/w:document/w:body/w:p,你可以retrive所有有需要的節點:

w:r/w:t 

但是,如果你需要的任何級別,但用了w:pict爲祖先retrive w:r/w:t,你可以使用ancestor軸這樣:

.//w:r/w:t[not(ancestor::w:pict)] 
+0

非常感謝... – Saravanan 2011-12-21 10:05:07

+0

請查看我更新的問題並嘗試解決我的問題 – Saravanan 2011-12-22 06:03:24

1

假設你使用的是自上而下的遞歸下降與XSL經典時尚XSLT處理這樣的:應用的模板,然後順便排除AW,R有一女:PICT孩子是這樣的:

<xsl:template match="w:r[w:pict]"/> 

我似乎記得對面,我想排除W A的情況下未來:R如果它唯一的子元素是一個寬:PICT。在這種情況下,解決辦法是

<xsl:template match="w:r[w:pict and count(*)=1]"/> 
0

您還可以使用過濾檢索那些沒有w:pict元素的所有w:r節點

<xs:for-each select="//w:r[count(w:pict) = 0]"> 
    <xsl:value-of select="w:paragraph" /> 
</xsl:for-each>