2012-07-24 50 views
-1

我是XSLT的新手,並且遇到了合併節點列表的問題。希望得到您的幫助,以下情形:合併XML2XML中的節點列表XSLT

輸入:

>  <A Id="1"> 
>   <B Id="4"> 
>   <Attr> 
>    <someAttr1>2</someAttr1> 
>    <someAttr2>1</someAttr2> 
>   </Attr> 
>   <C Id="7"> 
>    <Attr> 
>    <someAttr3>2</someAttr3> 
>    <someAttr4>1</someAttr4> 
>    <someAttr5>7</someAttr5> 
>    </Attr> 
>   </C> 
>   </B> 
>   <B Id="9"> 
>   <Attr> 
>    <someAttr1>6</someAttr1> 
>    <someAttr2>0</someAttr2> 
>   </Attr> 
>   <C Id="11"> 
>    <Attr> 
>    <someAttr3>1</someAttr3> 
>    <someAttr4>3</someAttr4> 
>    <someAttr5>5</someAttr5> 
>    </Attr> 
>   </C> 
>   </B> 
>  </A> 

輸出:

<A Id="1"> 
    <B Id="4"> 
     <Attr> 
     <someAttr1>2</someAttr1> 
     <someAttr2>1</someAttr2> 
     <someAttr3>2</someAttr3> 
     <someAttr4>1</someAttr4> 
     <someAttr5>7</someAttr5> 
     </Attr> 
    </B> 
    <B Id="9"> 
     <Attr> 
     <someAttr1>6</someAttr1> 
     <someAttr2>0</someAttr2> 
     <someAttr3>1</someAttr3> 
     <someAttr4>3</someAttr4> 
     <someAttr5>5</someAttr5> 
     </Attr> 
    </B> 
    </A> 
+0

以供將來參考,這將幫助很多,如果你能解釋一下轉型的規則,以避免人們不得不玩「點區別」。謝謝! – 2012-07-24 11:52:19

回答

2

它看起來像你想結合所有屬性元素髮生在任何級別的元素下的B元素。

首先,你需要一個模板來匹配元素與的Attr元素

<xsl:template match="B[Attr]"> 

而且在模板中,您將創建一個的Attr元素,並複製下的所有子元素的Attr元素

<Attr> 
    <xsl:copy-of select=".//Attr/*" /> 
</Attr> 

下面是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="B[Attr]"> 
     <B> 
     <xsl:apply-templates select="@*"/> 
     <Attr> 
      <xsl:copy-of select=".//Attr/*" /> 
     </Attr> 
     </B> 
    </xsl:template> 

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

當適用於您的示例XML,下面是輸出

<A Id="1"> 
    <B Id="4"> 
     <Attr> 
     <someAttr1>2</someAttr1> 
     <someAttr2>1</someAttr2> 
     <someAttr3>2</someAttr3> 
     <someAttr4>1</someAttr4> 
     <someAttr5>7</someAttr5> 
     </Attr> 
    </B> 
    <B Id="9"> 
     <Attr> 
     <someAttr1>6</someAttr1> 
     <someAttr2>0</someAttr2> 
     <someAttr3>1</someAttr3> 
     <someAttr4>3</someAttr4> 
     <someAttr5>5</someAttr5> 
     </Attr> 
    </B> 
</A> 
0

這裏有一個簡單的XSLT 1.0解決方案:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 

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

    <xsl:template match="B"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:for-each select='descendant::Attr'> 
        <xsl:copy-of select='*|@*' /> 
      </xsl:for-each> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@*"> 
     <xsl:copy-of select="."/> 
    </xsl:template> 

</xsl:stylesheet>