可以使用XSLT基于嵌套键合并文档中的子元素

时间:2014-03-18 10:32:53

标签: xml xslt-1.0

我想知道是否可以使用XSL合并文档中的元素。具体针对以下示例。

我想合并元素,以便有效地聚合元素,包括任何其他后代(孙子)。

请注意,Child的键隐式包含父键,因此123 / ABC与456 / ABC不同。

很高兴知道如何确定" Wins"对于发生覆盖的那些(例如父/名)。

从此

<?xml version="1.0" encoding="UTF-8"?>
<listOfParent>
<parent>
    <parentId>123</parentId>
    <name>Jim</name>
    <value>some data</value>
    <listOfChild>
        <child>
            <childReference>ABC</childReference>
            <name>Karen</name>
        </child>
    </listOfChild>
</parent>
<parent>
    <parentId>123</parentId>
    <name>Fred</name>
    <listOfChild>
        <child>
            <childReference>ABC</childReference>
            <name>Gemma</name>
        </child>
        <child>
            <childReference>DEF</childReference>
            <name>Karen</name>
        </child>
    </listOfChild>
</parent>
<parent>
    <parentId>456</parentId>
    <name>Bill</name>
    <listOfChild>
        <child>
            <childReference>ABC</childReference>
            <name>Penny</name>
        </child>
        <child>
            <childReference>DEF</childReference>
            <name>Rose</name>
        </child>
    </listOfChild>
</parent>

到这个

<?xml version="1.0" encoding="UTF-8"?>
<listOfParent>
<parent>
    <parentId>123</parentId>
    <name>not bothered</name>
    <value>some data</value>
    <listOfChild>
        <child>
            <childReference>ABC</childReference>
            <name>not bothered</name>
        </child>
        <child>
            <childReference>DEF</childReference>
            <name>Karen</name>
        </child>
    </listOfChild>
</parent>
<parent>
    <parentId>456</parentId>
    <name>Bill</name>
    <listOfChild>
        <child>
            <childReference>ABC</childReference>
            <name>Penny</name>
        </child>
        <child>
            <childReference>DEF</childReference>
            <name>Rose</name>
        </child>
    </listOfChild>
</parent>

这是我试过的XSL

<?altova_samplexml Untitled1.xml?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kGDByIdKey" match="parent" use="parentId"/>
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="parent
[generate-id()
=
 generate-id(key('kGDByIdKey', parentId)[1])
 ]">
    <xsl:copy>
        <xsl:apply-templates select="@*|key('kGDByIdKey', parentId)/node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="parent"/>

0 个答案:

没有答案