2011-12-21 26 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>を含むべきではないということにしたいです。 (形式上取得するには、このXSLT必要はないどのような変更を教えてください)

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

、これが私のXSLTのスニペットです::だから、私の上記のXMLドキュメントごとに、私は次のような出力を生成したい

<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> 

しかし、それは動作していません...

この問題を解決するために私を案内してください。あなたが任意のレベルではなく、祖先としてアウトw:pictw:r/w:tをretriveする必要がある場合は、

w:r/w:t 

しかしあなたを:あなたの現在のノードがある場合は、あなたの現在の例では

+0

テキスト '内に含まれている「私は、これが必要いけません」 'であり、「」には子「」が含まれていません。もう少しあなたの要件を明確にすることはできますか?子要素ではなく、祖先要素をチェックする必要があるように思えます。 –

+0

@TimC:はいtim. に等しくないの値を取得します。 – Saravanan

答えて

1

は、/w:document/w:body/w:pあなたが持つすべてのあなたの希望のノードをretriveすることができます以下のようなancestor軸を使用することができます。

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

ありがとうございました... – Saravanan

+0

私の更新された質問を見て、私の問題を解決してください – Saravanan

1

あなたがXSLとトップダウン再帰下降使用して古典的なXSLTの方法でこれを処理していると仮定すると:適用 - テンプレート、その後、AWを除外する方法:ありRをW:ピクト子供はこのようなものです。その唯一の子要素がWであった場合は、R:PICT

<xsl:template match="w:r[w: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> 
関連する問題