2015-12-28 63 views
0

我有一些具有屬性的多級XML。通過XSLT將多級別Xml數據顯示到單個級別中

需要通過Xslt將其轉換爲單個級別的Xml。

<root name="Measures" > 
    <Member name="MAF94"> 
     <Member name="MAF95"> 
      <Member name="MAM1" /> 
      <Member name="MAM2" /> 
     </Member> 
     <Member name="MAF96"> 
      <Member name="MAF97"> 
       <Member name="MAM254" /> 
       <Member name="MAF98"> 
        <Member name="MAM73" /> 
        <Member name="MAM74" /> 
        <Member name="MAF99"> 
         <Member name="MAM11" /> 
         <Member name="MAM10" /> 
        </Member> 
        <Member name="MAF100"> 
         <Member name="MAM18" /> 
         <Member name="MAM15" /> 
        </Member> 
       </Member> 
      </Member> 
     </Member> 
     <Member name="MAF352"> 
      <Member name="MAM1814" /> 
      <Member name="MAM1815" /> 
     </Member> 
    </Member> 
</root> 

以下是轉換上述xml後的預期結果。 輸入Xmls也可能包含更多的屬性。在示例中,我只輸入了一個屬性。

<root> 
    <Member name="MAF94" > 
     <Member name="MAF95"/> 
     <Member name="MAF96"/> 
     <Member name="MAF352"/> 
    </Member> 
    <Member name="MAF95"> 
     <Member name="MAM1" /> 
     <Member name="MAM2" /> 
    </Member> 
    <Member name="MAF96"> 
     <Member name="MAF97" /> 
    </Member> 
    <Member name="MAF97"> 
     <Member name="MAM254" /> 
     <Member name="MAF98" /> 
    </Member> 
    <Member name="MAF98"> 
     <Member name="MAM73" /> 
     <Member name="MAM74" /> 
     <Member name="MAF99" /> 
     <Member name="MAF100" /> 
    </Member> 
    <Member name="MAF99"> 
     <Member name="MAM11" /> 
     <Member name="MAM10" /> 
    </Member> 
    <Member name="MAF100"> 
     <Member name="MAM18" /> 
     <Member name="MAM15" /> 
    </Member> 
    <Member name="MAF352"> 
     <Member name="MAM1814" /> 
     <Member name="MAM1815" /> 
    </Member> 
</root> 

請告訴我轉換爲上述所需格式的適當方法。

謝謝。

回答

1

如果你想拉平一個嵌套的XML文檔,那麼你通常apply-templates所有子孫或在您的情況.//Member[Member]:在http://xsltransform.net/bFN1y9v

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

    <xsl:output indent="yes"/> 

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

    <xsl:template match="/*"> 
     <xsl:copy> 
      <xsl:apply-templates select=".//Member[Member]"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Member"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:apply-templates select="Member" mode="shallow"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Member" mode="shallow"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:transform> 

在線。

+0

不錯的XSLT'模式'。 –

+0

感謝馬丁,它工作。驚人的... –

+0

馬丁,請發送XSLT高級教程鏈接。 –