XSLT循环XML元素和框架单个文本

时间:2016-11-04 20:44:06

标签: xml xslt

我有一个以下格式的输入。我想循环使用MessageBody中的Error元素,并将响应消息作为单个文本构建,如下所示。可以帮助我。

Input:

<Response>
<Header>
</Header>
<Messagebody>
<Error>
<ErrorCode>E</ErrorCode>
<ErrorId>100000</ErrorId>
<ErrorDescription>UserId Not Found</ErrorDescription>
</Error>
<Error>
<ErrorCode>M</ErrorCode>
<ErrorId>100001</ErrorId>
<ErrorDescription>Source System Not Found</ErrorDescription>
</Error>
</Messagebody>
</Response>

Expected Output:

<Response>
<Fault>
<Text>[E];100000;UserId Not Found,[M];100001;Source System Not Found</Text>
</Fault>
</Response>

1 个答案:

答案 0 :(得分:0)

这是一个完整的解决方案

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

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

  <xsl:template match="Error[position() > 1]">
    <xsl:text>,</xsl:text>
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="Error/*">
    <xsl:value-of select="substring(';', 1, position() > 1)"/>
    <xsl:value-of select="substring('[', 1, name()='ErrorCode')"/>
    <xsl:value-of select="."/>
    <xsl:value-of select="substring(']', 1, name()='ErrorCode')"/>
  </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时

<Response>
    <Header></Header>
    <Messagebody>
        <Error>
            <ErrorCode>E</ErrorCode>
            <ErrorId>100000</ErrorId>
            <ErrorDescription>UserId Not Found</ErrorDescription>
        </Error>
        <Error>
            <ErrorCode>M</ErrorCode>
            <ErrorId>100001</ErrorId>
            <ErrorDescription>Source System Not Found</ErrorDescription>
        </Error>
    </Messagebody>
</Response>

产生了想要的正确结果

[E];100000;UserId Not Found,[M];100001;Source System Not Found