我想从平面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>
答案 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>
我认为除了分支的排序外,它与您的预期输出相同。