XSLT将带有点的扁平xml转换为分层xml

时间:2017-04-10 12:17:00

标签: xslt

我想使用XSLT在XML下进行转换。此XML元素具有表示层次结构

的点
<UsrEmployee>
            <Code>70068579</Code>
            <Initials>F</Initials>
            <FirstName>Koichi</FirstName>
            <Prefix></Prefix>
            <LastName>Nakamura</LastName>
            <PropertyRef>70068579</PropertyRef>
            <SpaceRef.Code>001</SpaceRef.Code>
            <SpaceRef.FloorRef.Code>01</SpaceRef.FloorRef.Code>
            <SpaceRef.FloorRef.PropertyRef>70068579</SpaceRef.FloorRef.PropertyRef>
            <SpaceRef.propertyRef>70068579</SpaceRef.propertyRef>
        </UsrEmployee>

上面的XML我想要转换为下面的XML,在源XML元素名称中可以是任何东西,点数(深度)是未知的(不固定)。我想创建XSLT,它可以将任何大小的通用XML转换为层次结构

<UsrEmployee>
    <Code>70068579</Code>
    <Initials>F</Initials>
    <FirstName>Koichi</FirstName>
    <Prefix></Prefix>
    <LastName>Nakamura</LastName>
    <SpaceRef>
        <Code>001</Code>
        <propertyRef>70068579</propertyRef>
        <FloorRef>
            <Code>01</Code>
            <PropertyRef>70068579</PropertyRef>
        </FloorRef>
    </SpaceRef>     
    <PropertyRef>70068579</PropertyRef>
</UsrEmployee>

有人可以帮助我吗

1 个答案:

答案 0 :(得分:1)

只需为您的&#34;点缀&#34;创建匹配的模板元素并应用它们。

使用select来控制&#34; catch-all&#34;身份模板(xslt中的最后一个模板)

当然,这可能是一个过于简单的解决方案,如果您有一个任意的层次结构,选择这样的模板是不切实际的,那么将需要更复杂的转换。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="UsrEmployee">
        <xsl:element name="UsrEmployee">
            <xsl:apply-templates select="Code | Initials | FirstName | Prefix | LastName | PropertyRef" />

            <xsl:element name="SpaceRef">
                <xsl:apply-templates select="SpaceRef.Code | SpaceRef.propertyRef" />

                <xsl:element name="FloorRef">
                    <xsl:apply-templates select="SpaceRef.FloorRef.Code | SpaceRef.FloorRef.PropertyRef" />
                </xsl:element>
            </xsl:element>
        </xsl:element>
    </xsl:template>

    <xsl:template match="SpaceRef.Code">
        <xsl:element name="Code">
            <xsl:value-of select="." />
        </xsl:element>
    </xsl:template>

    <xsl:template match="SpaceRef.propertyRef">
        <xsl:element name="propertyRef">
            <xsl:value-of select="." />
        </xsl:element>
    </xsl:template>

    <xsl:template match="SpaceRef.FloorRef.Code">
        <xsl:element name="Code">
            <xsl:value-of select="." />
        </xsl:element>
    </xsl:template>

    <xsl:template match="SpaceRef.FloorRef.PropertyRef">
        <xsl:element name="PropertyRef">
            <xsl:value-of select="." />
        </xsl:element>
    </xsl:template>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>