我正在尝试在我的某个产品中使用xslt而且我在下面的问题上遇到了问题。
作为回复,我得到一个包含一些字段的XML,更有可能有两个主要的列表节点Header
和Details
,Details
是通过处理和{{返回的主要数据1}}具有与输出相关的编码和其他数据,如果Header
为error 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>
谢谢!
答案 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>