使用XSLT的多层次级XML到扁平XML

时间:2012-04-02 07:50:46

标签: xml xslt

我是新的XSLT,任何机构都可以建议完全转换的XSLT代码::: 多层次XML文件位于::

之下
<ROOT>
    <RECORD>
        <TAG1> One </TAG1>
        <TAG2> Two A</TAG2>
        <TAG2> Two B</TAG2>
        <TAG3> Three</TAG3>
        <TAG4> Four A</TAG4>
        <TAG4> Four B</TAG4>
        <TAG5> Five </TAG5>
    </RECORD>
    <RECORD>
        <TAG1> One </TAG1>
        <TAG2> Two A</TAG2>
        <TAG2> Two B</TAG2>
        <TAG2> Two C</TAG2>
        <TAG3> Three</TAG3>
        <TAG4> Four A</TAG4>
        <TAG4> Four B</TAG4>
        <TAG4> Four C</TAG4>
        <TAG5> Five </TAG5>
    </RECORD>
    <RECORD>
        <TAG1> One </TAG1>
        <TAG2> Two</TAG2>
        <TAG3> Three</TAG3>
        <TAG4> Four</TAG4>
        <TAG5> Five </TAG5>
    </RECORD>
</ROOT>

我想将上面的内容转换为以下内容::

<ROOT>
    <RECORD>
        <TAG1> One </TAG1>
        <TAG2> Two A</TAG2>
        <TAG3> Three</TAG3>
        <TAG4> Four A</TAG4>
        <TAG5> Five </TAG5>
    </RECORD>
    <RECORD>
        <TAG1> One </TAG1>      
        <TAG2> Two B</TAG2>
        <TAG3> Three</TAG3>     
        <TAG4> Four B</TAG4>
        <TAG5> Five </TAG5>
    </RECORD>
    <RECORD>
        <TAG1> One </TAG1>
        <TAG2> Two A</TAG2>
        <TAG3> Three</TAG3>
        <TAG4> Four A</TAG4>
        <TAG5> Five </TAG5>
    </RECORD>
    <RECORD>
        <TAG1> One </TAG1>
        <TAG2> Two B</TAG2>
        <TAG3> Three</TAG3>
        <TAG4> Four B</TAG4>
        <TAG5> Five </TAG5>
    </RECORD>
    <RECORD>
        <TAG1> One </TAG1>
        <TAG2> Two C</TAG2>
        <TAG3> Three</TAG3>
        <TAG4> Four C</TAG4>
        <TAG5> Five </TAG5>
    </RECORD>
    <RECORD>
        <TAG1> One </TAG1>
        <TAG2> Two</TAG2>
        <TAG3> Three</TAG3>
        <TAG4> Four</TAG4>
        <TAG5> Five </TAG5>
    </RECORD>
</ROOT>

任何机构都可以为此建议XSLT代码吗? 感谢。

1 个答案:

答案 0 :(得分:0)

对于这种情况,命名模板(函数)是必需的。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:template name="addRecord">
        <xsl:param name="rank" select="1" />
        <xsl:param name="numberOfRecords" />
        <xsl:if test="$rank &lt;= $numberOfRecords">
            <RECORD>
                <xsl:copy-of select="TAG1" />
                <xsl:copy-of select="TAG2[$rank]" />
                <xsl:copy-of select="TAG3" />
                <xsl:copy-of select="TAG4[$rank]" />
                <xsl:copy-of select="TAG5" />
            </RECORD>
            <xsl:call-template name="addRecord">
                <xsl:with-param name="rank" select="$rank + 1" />
                <xsl:with-param name="numberOfRecords" select="$numberOfRecords" />
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
    <xsl:template match="ROOT">
        <xsl:copy>
            <xsl:apply-templates select="RECORD" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="RECORD">
        <xsl:call-template name="addRecord">
            <xsl:with-param name="numberOfRecords">
                <xsl:choose>
                    <xsl:when test="count(TAG2) &gt; count(TAG4)">
                        <xsl:value-of select="count(TAG2)" />
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="count(TAG4)" />                   
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:with-param>
        </xsl:call-template>
    </xsl:template>
</xsl:stylesheet>