2012-03-08 83 views
1

想我這有這個XML文檔,這裏...只是代表其他雜項節點:匹配包含具體內容的子節點的所有節點

<AA> 
    <BB> 
     <CC>True</CC> 
     ... 
    </BB> 

    <BB> 
     <CC>True</CC> 
     ... 
    </BB> 

    <BB> 
     <CC>False</CC> 
     ... 
    </BB> 

    <BB> 
     <CC>True</CC> 
     ... 
    </BB> 


    <BB> 
     <CC>False</CC> 
     ... 
    </BB> 
</AA> 

我試圖做一些模板,例如:

<xsl:template match="/"> 

<DD> 
    <xsl:apply-templates select="/AA/YYY" /> 
</DD> 

<EE> 
    <xsl:apply-templates select="/AA/XXX" /> 
</EE> 

</xsl:template> 

<xsl:template match="YYY"> 
<!-- do stuff --> 
</xsl:template> 

<xsl:template match="XXX"> 
    <!-- do stuff --> 
</xsl:template> 

要產生類似的輸出:

<AA> 
    <DD> 
     <BB> 
      <CC>True</CC> 
     </BB> 
     <BB> 
      <CC>True</CC> 
      ... 
     </BB> 

     <BB> 
      <CC>True</CC> 
      ... 
     </BB> 
    </DD> 

    <EE> 
     <BB> 
      <CC>False</CC> 
      ... 
     </BB> 

     <BB> 
      <CC>False</CC> 
      ... 
     </BB> 
    </EE> 
</AA> 

我只是在努力尋找的XPath放置在匹配屬性中,我現在將XXX和YYY放置在那裏。任何人都得到了答案?

基本上我想選擇所有具有包含特定內容的子節點的節點。

回答

1

如果您使用身份轉換,如果您不打算更改<BB>元素中的任何內容,則不需要任何其他模板。

XML輸入

<AA> 
    <BB> 
    <CC>True</CC> 
    ... 
    </BB> 

    <BB> 
    <CC>True</CC> 
    ... 
    </BB> 

    <BB> 
    <CC>False</CC> 
    ... 
    </BB> 

    <BB> 
    <CC>True</CC> 
    ... 
    </BB> 


    <BB> 
    <CC>False</CC> 
    ... 
    </BB> 
</AA> 

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/AA"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <DD> 
     <xsl:apply-templates select="BB[CC='True']"/> 
     </DD> 
     <EE> 
     <xsl:apply-templates select="BB[CC='False']"/> 
     </EE> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

XML輸出

<AA> 
    <DD> 
    <BB> 
     <CC>True</CC> 
     ... 
    </BB> 
    <BB> 
     <CC>True</CC> 
     ... 
    </BB> 
    <BB> 
     <CC>True</CC> 
     ... 
    </BB> 
    </DD> 
    <EE> 
    <BB> 
     <CC>False</CC> 
     ... 
    </BB> 
    <BB> 
     <CC>False</CC> 
     ... 
    </BB> 
    </EE> 
</AA> 

如果您確實需要更改<BB>添加其他模板以覆蓋身份轉換。

+0

謝謝。 'BB [CC ='True']'語法就是我一直在尋找的東西。我需要做的比原來提出的問題要多,這只是一件大事而已。感謝您的明確答案和良好的示例輸入/輸出。 – user17753 2012-03-09 18:14:14

+0

@ user1169578 - 非常歡迎。 +1是一個很好的問題。 – 2012-03-09 18:19:20

相關問題