2011-12-21 77 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>