我需要有关 XSLT 的帮助

I need help on XSLT

这是要转换的负载:

<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>

问:可能吗?怎么样?

如果您准备好使用 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>

据我了解,您有一个名为 results 的(单个)根标签, 包含:

  • 发票数量...totalAmmount...状态...date... 标签,连接成相应的目标标签。
  • 单个 invoiceAmmount 标签,仅用于复制到输出。

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

它有2个参数:

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

此模板:

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

此模板被调用了 4 次,用于名为 invoice...totalAmmount...、[=26= 的源元素]status... 和 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