这是要转换的有效负载:
<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>
问题:有可能吗?怎么样?
答案 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 的(单个)根标签, 含有:
以公共前缀开头的多个源元素的连接 可以使用专用模板执行以数字数字结尾。
它有两个参数:
此模板:
对于名为 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