XSLT:使用xslt

时间:2017-12-04 02:39:07

标签: xml xslt xslt-1.0

我正在尝试在我的某个产品中使用xslt而且我在下面的问题上遇到了问题。

作为回复,我得到一个包含一些字段的XML,更有可能有两个主要的列表节点HeaderDetailsDetails是通过处理和{{返回的主要数据1}}具有与输出相关的编码和其他数据,如果Headererror code,这意味着,这是错误,其他错误代码被视为成功。

XML响应示例:

70

现在输出应

<?xml version="1.0"?>
<root>
    <subroot>
        <data>
            <Header>
                <SCode>1</SCode>
                <StatusCode>0</StatusCode>
                <ErrorCode>00000000</ErrorCode>
                <ErrorDesc>This is OK</ErrorDesc>
            </Header>
            <Details>
                <accountNumber>1111X</accountNumber>
                <accountType>D</accountType>
                <Total>10000</Total>
                <Interest>10</Interest>
                <NewFlag>N</NewFlag>
            </Details>
        </data>
        <data>
            <Header>
                <SCode>1</SCode>
                <StatusCode>12</StatusCode>
                <ErrorCode>70</ErrorCode>
                <ErrorDesc>This is ERROR</ErrorDesc>
            </Header>
            <Details>
                <accountNumber>2222</accountNumber>
                <accountType>D</accountType>
                <Total>1000</Total>
                <Interest>12</Interest>
                <NewFlag>Y</NewFlag>
            </Details>
        </data>
    </subroot>
</root>

谢谢!

1 个答案:

答案 0 :(得分:1)

根据示例输入XML和所需的输出共享,您可以执行以下操作来实现结果。

身份转换模板开始,该模板将按原样将结构复制到输出中。

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

<xsl:for-each>节点上使用<Header>并使用节点的position()作为参考,可以在输出中捕获相应的帐户信息。下面是XSLT以供输出参考。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*" />

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

    <xsl:template match="data">
        <xsl:copy>
            <xsl:for-each select="Header">
                <xsl:variable name="pos" select="position()" />
                <xsl:choose>
                    <xsl:when test="ErrorCode = '70'">
                        <Details>
                            <xsl:apply-templates select="ErrorCode" />
                            <xsl:apply-templates select="ErrorDesc" />
                            <xsl:apply-templates select="../Details[$pos]/accountNumber" />
                            <xsl:apply-templates select="../Details[$pos]/accountType" />
                        </Details>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:copy-of select="../Details[$pos]" />
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

输出

<root>
    <subroot>
        <data>
            <Details>
                <accountNumber>1111X</accountNumber>
                <accountType>D</accountType>
                <Total>10000</Total>
                <Interest>10</Interest>
                <NewFlag>N</NewFlag>
            </Details>
        </data>
        <data>
            <Details>
                <ErrorCode>70</ErrorCode>
                <ErrorDesc>This is ERROR</ErrorDesc>
                <accountNumber>2222</accountNumber>
                <accountType>D</accountType>
            </Details>
        </data>
    </subroot>
</root>