重组&合并XML中的数据

时间:2014-02-27 10:14:44

标签: xml xslt xslt-1.0

我的输入XML看起来像 -

<ROWS>
    <ROW>
        <ROW_NUMBER>001</ROW_NUMBER>
        <ARTICLE>
            <ARTICLE_ID>Q2D110914</ARTICLE_ID>
            <ARTICLE_NAME>A_Name</ARTICLE_NAME>
        </ARTICLE>
        <PRICE_PER_UNIT>
            <AMOUNT SIGN="+">19</AMOUNT>
        </PRICE_PER_UNIT>
    </ROW>
    <ROW ROW_TYPE="QTY">
        <QUANTITY>
            <ORDERED Q_UNIT="VB" SIGN="+">20</ORDERED>
        </QUANTITY>
    </ROW>
    <ROW ROW_TYPE="PID">
        <ARTICLE>
            <ARTICLE_DESCRIPTIONS>
                <ARTICLE_DESCRIPTION>
                    <DESCRIPTION_TYPE>A_Description</DESCRIPTION_TYPE>
                </ARTICLE_DESCRIPTION>
            </ARTICLE_DESCRIPTIONS>
        </ARTICLE>
    </ROW>
</ROWS>

所需的输出应该是这样的 -

<ROWS>
    <ROW>
        <ROW_NUMBER>001</ROW_NUMBER>
        <ARTICLE>
            <ARTICLE_ID>Q2D110914</ARTICLE_ID>
            <ARTICLE_NAME>A_Name</ARTICLE_NAME>
            <ARTICLE_DESCRIPTIONS>
                <ARTICLE_DESCRIPTION>
                    <DESCRIPTION_TYPE>A_Description</DESCRIPTION_TYPE>
                </ARTICLE_DESCRIPTION>
            </ARTICLE_DESCRIPTIONS>
        </ARTICLE>
        <QUANTITY>
            <ORDERED Q_UNIT="VB" SIGN="+">20</ORDERED>
        </QUANTITY>
        <PRICE_PER_UNIT>
            <AMOUNT SIGN="+">19</AMOUNT>
        </PRICE_PER_UNIT>
    </ROW>      
</ROWS>

我尝试使用'following ::'xpath但是没有得到所需的输出。它需要通过xslt 1.0重组和合并xml数据。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

以下转换在应用于样本输入时会生成所需的输出结构。但它的格式还不是很好。

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

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

<xsl:template match="ROW[@ROW_TYPE]" />

<xsl:template match="ROW[not(@ROW_TYPE)]">
    <xsl:copy>
        <xsl:copy-of select="ROW_NUMBER" />
        <xsl:apply-templates select="ARTICLE" />
        <xsl:apply-templates select="following::ROW[@ROW_TYPE='QTY'][1]/QUANTITY" />
        <xsl:copy-of select="PRICE_PER_UNIT" />
    </xsl:copy>
</xsl:template>

<xsl:template match="ARTICLE">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
        <xsl:copy-of select="following::ARTICLE[1]/ARTICLE_DESCRIPTIONS" />
    </xsl:copy>
</xsl:template>

</xsl:transform>