我需要有关 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
这是要转换的负载:
<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