【问题标题】:Transformation using XSLT使用 XSLT 进行转换
【发布时间】:2016-04-12 10:24:51
【问题描述】:

需要帮助将 SOAP 消息转换为 XML: 元素“externalID”可以多次出现,所以基于“externalID”这个元素需要在输出XML中生成“Detail”标签。

需要一些代码示例来将此 SOAP 消息转换为所需的输出 XML 输入 SOAP 消息:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mem="http://example.com/vc/types/attachments">
   <soapenv:Header/>
   <soapenv:Body>
      <mem:payRequest>
         <payload>
            <uuid>?</uuid>
            <umi>?</umi>
            <externalID>
               <externalLineID></externalLineID>
               <groupNo>?</groupNo>
               <payeeCd>dfsdfsfd</payeeCd>
               <paymntAmt>?</paymntAmt>
               <acctCd>dfafa</acctCd>
               <transID>fasf</transID>
               <errCD>?</errCD>
               <errMessage>?</errMessage>
            </externalID>
            <externalID>
               <externalLineID>?</externalLineID>
               <groupNo>?</groupNo>
               <payeeCd>dfsdfsfd</payeeCd>
               <paymntAmt>?</paymntAmt>
               <acctCd>dfafa</acctCd>
               <transID>fasf</transID>
               <errCD>?</errCD>
               <errMessage>?</errMessage>
            </externalID>
            <errCD>?</errCD>
            <errMessage>?</errMe`enter code here`ssage>
         </payload>
      </mem:payRequest>
   </soapenv:Body>
</soapenv:Envelope>

==============

所需的输出 XML:

<payRequest>
    <Detail>
        <uuid>?</uuid>
        <umd>?</umd>
        <claimNumber></claimNumber>
        <claimLineNumber>?</claimLineNumber>
        <dd>1</dd>
        <claimStatus></claimStatus>
        <clientNumber></clientNumber>
        <payMode>Other</payMode>
        <paymentAmount></paymentAmount>
        <accountCode></accountCode>
        <transactionId></transactionId>
        <errorCode></errorCode>
        <returnCode></returnCode>
    </Detail>
    <Detail>
        <uuid>?</uuid>
        <umd>?</umd>
        <claimNumber></claimNumber>
        <claimLineNumber>?</claimLineNumber>
        <dd>1</dd>
        <claimStatus></claimStatus>
        <clientNumber></clientNumber>
        <payMode>Other</payMode>
        <paymentAmount></paymentAmount>
        <accountCode></accountCode>
        <transactionId></transactionId>
        <errorCode></errorCode>
        <returnCode></returnCode>
    </Detail>
</payRequest>

【问题讨论】:

  • 需要一些代码示例”不是问题。
  • 嗨迈克尔,基本上我试图将上面的 SOAP 消息转换为 XML 我在基于传入标签“externalID”创建标签“详细信息”时面临挑战,这个标签是数组,所以需要在输出 XML 中构建该“详细信息”数组。你能帮我怎么做这个转换。
  • 发布您的尝试,以便我们修复它,而不是从头开始编写所有内容。
  • 我正在尝试仅对一个字段进行映射。下面是我的 XSLT。

标签: xslt-1.0


【解决方案1】:

我建议您按照以下方式尝试:

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

<xsl:template match="/">
     <payRequest>
         <xsl:for-each select="//externalID">
            <Detail>            
                <uuid>
                    <xsl:value-of select="../uuid"/>
                </uuid>
                <umd>
                    <xsl:value-of select="../umi"/>
                </umd>
                <claimNumber>
                    <xsl:value-of select="XYZ"/>
                </claimNumber>
                <claimLineNumber>
                    <xsl:value-of select="externalLineID"/>
                </claimLineNumber>
                <dd>
                    <xsl:value-of select="XYZ"/>
                </dd>
                <claimStatus>
                    <xsl:value-of select="XYZ"/>
                </claimStatus>
                <clientNumber>
                    <xsl:value-of select="XYZ"/>
                </clientNumber>
                <payMode>
                    <xsl:value-of select="XYZ"/>
                </payMode>
                <paymentAmount>
                    <xsl:value-of select="paymntAmt"/>
                </paymentAmount>
                <accountCode>
                    <xsl:value-of select="XYZ"/>
                </accountCode>
                <transactionId>
                    <xsl:value-of select="transID"/>
                </transactionId>
                <errorCode>
                    <xsl:value-of select="errCD"/>
                </errorCode>
                <returnCode>
                    <xsl:value-of select="XYZ"/>
                </returnCode>
            </Detail>
         </xsl:for-each>
      </payRequest>
</xsl:template>

</xsl:stylesheet>

您没有提供有关哪些源节点应该为结果提供数据的任何信息。我试着猜了几个,并用XYZ 作为其他人的占位符。

注意:您永远不必使用像 *[local-name()='externalID'] 这样的 hack。

【讨论】:

  • 谢谢迈克尔,我尝试了你建议的方式,它按预期工作。
  • 嗨迈克尔,我接受了答案,但不确定如何关闭它。再次感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 2014-06-14
  • 2012-09-30
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多