2016-11-08 62 views
0

我很難從平面XML數據源創建嵌套XML元素。我們的目標是採取<Path>,其中每個級別通過每個<Level>的列表在層次結構中表示,並將其轉換爲嵌套<Folder>輸出XML文件的層次結構。使用XSLT創建來自平面XML數據的嵌套XML元素輸出

源數據集的XML文件看起來像這樣:

<Path> 
    <Level DataID='2000' Name='Root'></Level> 
    <Level DataID='427438' Name=Sub Level 1'></Level> 
    <Level DataID='427439' Name=Sub Level 2'></Level> 
    <Level DataID='427440' Name=Sub Level 3'></Level> 
</Path> 

所需的輸出嵌套<folder>元素,其中嵌套的元件的數量可以變化的基礎上<levels>數據集中的數量。

<Parent> 
<folder displayName="Root"> 
    <folder displayName="Level 1"> 
    <folder displayName="Level 2"> 
     <folder displayName="Level 3"> 
     </folder> 
    </folder> 
    </folder> 
</folder> 
</Parent> 

我一直在試圖與<xsl:apply-templates><xsl:for-each>標籤,其中,輸出採用<xsl:element>標籤各種辦法,但都無濟於事。

+0

您的源XML無效。並不是所有的屬性都適合。 – zx485

回答

0

從平面輸入創建嵌套結構的一種可能性是下面的一種。不幸的是,您的輸入XML無效(請參閱上面的註釋),所以輸出不一定符合您的全部要求(在您的「級別」前有一個「Sub」):

此XSLT應該誘騙通過遞歸地施加xsl:call-template

<?xml version = "1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
    <xsl:template match="Path"> 
     <Parent> 
     <xsl:call-template name="SubFolder"> 
      <xsl:with-param name="curElem" select="Level[1]" /> 
     </xsl:call-template> 
     </Parent> 
    </xsl:template> 

    <xsl:template name="SubFolder"> 
     <xsl:param name="curElem" /> 
     <folder displayName="{$curElem/@Name}"> 
     <xsl:if test="$curElem/following-sibling::Level[1]"> 
      <xsl:call-template name="SubFolder"> 
      <xsl:with-param name="curElem" select="$curElem/following-sibling::Level[1]" /> 
      </xsl:call-template> 
     </xsl:if> 
     </folder>  
    </xsl:template>  
</xsl:stylesheet> 

輸出(適用於消毒輸入XML)是這樣的:

<?xml version="1.0"?> 
<Parent> 
    <folder displayName="Root"> 
     <folder displayName="Sub Level 1"> 
      <folder displayName="Sub Level 2"> 
       <folder displayName="Sub Level 3"/> 
      </folder> 
     </folder> 
    </folder> 
</Parent> 

有可能是更容易的解決方案,但它的工作。

+0

謝謝你的幫助。這真的很好。 – RGascho