在XSLT

时间:2018-07-25 15:44:18

标签: xslt elements

我想在Xml中使用XSLT动态创建与Main xml中的<Group>元素一样多的<Group folder ="Group1">元素。另外,添加为最后一个子元素的<Data>元素只能在内部添加一次。

主要Xml

<Root>
    <ClassA>
    <Groups>
    <Group1>
        <Group2>
            <Group3>
             ............
            </Group3>
        </Group2>
    </Group1>
    </Groups>
    <Data>
        <Name>George</Name>
        <Class>A</Class>
    </Data>
    </ClassA> 
</Root>

我需要这样的Xml

<Data>
    <ClassA>
    <Group folder = "Group1">
        <Group folder = "Group2">
            <Group folder = "Group3">
             ............

            <Data>
                <Name>George</Name>
                <Class>A</Class>
            </Data>
            </Group>
        </Group>
    </Group>

    </ClassA> 
</Data>

2 个答案:

答案 0 :(得分:0)

实际上,您需要以下模板:

  1. 匹配Root。生成<Data>元素并在其中 将模板应用于自己的全部内容。

  2. 匹配ClassA。复制自己的元素并在内部复制 将模板应用于子Groups元素的内容。

  3. 匹配名称中包含Group,然后包含数字的元素。 使用适当的Group属性创建folder元素。 将模板应用于其内容(如果有)。 如果此元素不包含任何子元素,请复制 来自祖先Data的{​​{1}}元素。

  4. 身份模板

因此整个脚本如下所示:

ClassA

有关工作示例,请参见http://xsltransform.net/nb9MWtw

答案 1 :(得分:0)

 <xsl:output method="xml" indent="yes"/>
    <xsl:template match="Root">
        <xsl:element name="Data">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="ClassA">
        <xsl:element name="ClassA">
            <group floder="{Groups/Group1/name()}">
                <group floder="{Groups/Group1/Group2/name()}">
                    <group floder="{Groups/Group1/Group2/Group3/name()}">
                        <xsl:value-of select="Groups/Group1/Group2/Group3"/>
                        <xsl:copy-of select="Data"/>
            </group>
                </group>
            </group>
        </xsl:element>
    </xsl:template>

尝试对您有益。