我需要XSLT的帮助

时间:2018-03-12 11:51:52

标签: xml xslt soap wso2

这是要转换的有效负载:

<result>
<invoice0>201762133</invoice0> 
<invoice1>201730800</invoice1>
<invoice2>2016419446</invoice2>
<totalAmmount0>10208.32</totalAmmount0> 
<totalAmmount1>10196.62</totalAmmount1>
<totalAmmount2>10196.62</totalAmmount2>
<status0>Open</status0> 
<status1>Open</status1>
<status2>Closed</status2>
<date0>30/03/2017</date0>
<date1>28/02/2017</date1>
<date2>30/01/2017</date2>
<invoiceAmmount>3</invoiceAmmount> 
</result>

因此,我无法在转换之前更改此有效负载,而且我无法通过这种方式进行交付:

<result>
<invoiceNumber>201762133,201730800,2016419446</invoiceNumber> 
<totalAmmount>10208.32,10196.62,10196.62</totalAmmount>
<statusInvoice>Open,Open,Closed</statusInvoice>
<dueDate>30/03/2017,28/02/2017,30/01/2017</dueDate>
<invoiceAmmount>3</invoiceAmmount> 
</result>

问题:有可能吗?怎么样?

2 个答案:

答案 0 :(得分:1)

如果您准备好使用XSLT,请使用以下代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" version="2.0">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="result">
        <result>
            <invoiceNumber>
                <xsl:value-of select="*[matches(name(),'invoice[0-9]')]" separator=","/>    
            </invoiceNumber> 
            <totalAmmount>
                <xsl:value-of select="*[matches(name(),'totalAmmount[0-9]')]" separator=","/>    
            </totalAmmount>
            <statusInvoice>
                <xsl:value-of select="*[matches(name(),'status[0-9]')]" separator=","/>
            </statusInvoice>
            <dueDate>
                <xsl:value-of select="*[matches(name(),'date[0-9]')]" separator=","/>
            </dueDate>
            <invoiceAmmount>3</invoiceAmmount> 
        </result>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

据我所知,你有一个名为 results 的(单个)根标签, 含有:

  • 许多发票...... totalAmmount ... 状态...... date ... 标签,以连接到各自的目标标签。
  • 单个 invoiceAmmount 标记,只是为了复制到输出。

以公共前缀开头的多个源元素的连接 可以使用专用模板执行以数字数字结尾。

它有两个参数:

  • sourceTag - 源元素名称前缀。
  • targetTag - 要创建的代码名称。

此模板:

  • 打印开始目标标记。
  • 打印与给定前缀匹配的源元素的值 和一些数字。
  • 打印结束目标标记。

对于名为 invoice ... totalAmmount ... status ... 的源元素,此模板被调用4次 date ... ,具有相应的目标标记名称。

所以整个脚本可能如下所示:

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

  <xsl:template match="result">
    <result>
      <xsl:call-template name="cumulate">
        <xsl:with-param name="sourceTag" select="'invoice'"/>
    <xsl:with-param name="targetTag" select="'invoiceNumber'"/>
      </xsl:call-template>
      <xsl:call-template name="cumulate">
        <xsl:with-param name="sourceTag" select="'totalAmmount'"/>
        <xsl:with-param name="targetTag" select="'totalAmmount'"/>
      </xsl:call-template>
      <xsl:call-template name="cumulate">
        <xsl:with-param name="sourceTag" select="'status'"/>
        <xsl:with-param name="targetTag" select="'statusInvoice'"/>
      </xsl:call-template>
      <xsl:call-template name="cumulate">
        <xsl:with-param name="sourceTag" select="'date'"/>
        <xsl:with-param name="targetTag" select="'dueDate'"/>
      </xsl:call-template>
      <xsl:apply-templates select="invoiceAmmount"/>
    </result>
  </xsl:template>

  <xsl:template name="cumulate">
    <xsl:param name="sourceTag"/>
    <xsl:param name="targetTag"/>
    <xsl:element name="{$targetTag}">
      <xsl:value-of select="*[matches(name(), concat($sourceTag,'\d+'))]" separator=","/>
    </xsl:element>
  </xsl:template>

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

有关工作示例,请参阅http://xsltransform.net/3MEbY6L