XSLT-从XML创建树

时间:2014-07-31 14:59:59

标签: xml xslt tree

我想从平面XML文件创建具有分层结构的XML。 XML文件包含父子关系,以及节点是否为叶子。

没有关于嵌套级别或结构中根节点的明确信息。 XML文件可以包含多个根元素,并且不是有序的。

<list>
<stru><parent>A01</parent><child>P04</child></stru>
<stru><parent>B11</parent><child>P01</child></stru>
<stru><parent>B12</parent><child>P01</child></stru>
<stru><parent>B12</parent><child>P03</child></stru>
<stru><parent>B21</parent><child>P02</child></stru>
<stru><parent>B21</parent><child>P03</child></stru>
<item><cod>B01</cod><isparent>Y</isparent></item>
<item><cod>B11</cod><isparent>Y</isparent></item>
<item><cod>B12</cod><isparent>Y</isparent></item>
<item><cod>B21</cod><isparent>Y</isparent></item>
<item><cod>P01</cod><isparent>N</isparent></item>
<item><cod>P02</cod><isparent>N</isparent></item>
<item><cod>P03</cod><isparent>N</isparent></item>
<item><cod>A01</cod><isparent>Y</isparent></item>
<item><cod>P04</cod><isparent>N</isparent></item>
<stru><parent>B01</parent><child>B11</child></stru>
<stru><parent>B01</parent><child>B12</child></stru>
<stru><parent>B11</parent><child>B21</child></stru>
</list>

所需结果如下所示。我不知道该怎么做。

如果知道根节点,我发现了一个创建该结构的转换。

<list>
    <itemlist>
        <item>
            <cod>A01</cod>
            <itemlist>
                <item>
                    <cod>P04</cod>
                </item>
            </itemlist>
        </item>
        <item>              
            <cod>B01</cod>
            <itemlist>
                <item>
                    <cod>B11</cod>
                    <itemlist>
                        <item>
                            <cod>B21</cod>
                            <itemlist>
                                <item>
                                    <cod>P02</cod>
                                </item>
                                <item>
                                    <cod>P03</cod>
                                </item>
                            </itemlist> 
                        </item>
                        <item>
                            <cod>P01</cod>
                        </item>
                    </itemlist>
                </item>
                <item>
                    <cod>B12</cod>
                    <itemlist>
                        <item>
                            <cod>P01</cod>
                        </item> 
                        <item>
                            <cod>P02</cod>
                        </item> 
                    </itemlist> 
                </item>
            </itemlist>
        </item>
    </itemlist>
</list>

1 个答案:

答案 0 :(得分:0)

以下样式表:

XSLT 1.0

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

<xsl:key name="link-by-child" match="stru" use="child" />
<xsl:key name="link-by-parent" match="stru" use="parent" />
<xsl:key name="item-by-code" match="item" use="cod" />

<xsl:template match="/">
    <list>
        <itemlist>
            <!-- select progenitors (items that are not children of any other item) -->
            <xsl:apply-templates select="list/item[not(key('link-by-child', cod))]"/>
        </itemlist>
    </list>
</xsl:template>

<xsl:template match="item[isparent='Y']">
    <xsl:copy>
        <xsl:copy-of select="cod"/>
        <itemlist>
            <!-- select item's children -->
            <xsl:apply-templates select="key('item-by-code', key('link-by-parent', cod)/child)"/>
        </itemlist></xsl:copy>
</xsl:template>

<xsl:template match="item[isparent='N']">
    <xsl:copy>
        <xsl:copy-of select="cod"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

应用于您的示例输入时,将返回:

<?xml version="1.0" encoding="UTF-8"?>
<list>
   <itemlist>
      <item>
         <cod>B01</cod>
         <itemlist>
            <item>
               <cod>B11</cod>
               <itemlist>
                  <item>
                     <cod>B21</cod>
                     <itemlist>
                        <item>
                           <cod>P02</cod>
                        </item>
                        <item>
                           <cod>P03</cod>
                        </item>
                     </itemlist>
                  </item>
                  <item>
                     <cod>P01</cod>
                  </item>
               </itemlist>
            </item>
            <item>
               <cod>B12</cod>
               <itemlist>
                  <item>
                     <cod>P01</cod>
                  </item>
                  <item>
                     <cod>P03</cod>
                  </item>
               </itemlist>
            </item>
         </itemlist>
      </item>
      <item>
         <cod>A01</cod>
         <itemlist>
            <item>
               <cod>P04</cod>
            </item>
         </itemlist>
      </item>
   </itemlist>
</list>

我认为除了分支的排序外,它与您的预期输出相同。

相关问题