必须转换的xml有效负载:
<xml>
<invoice0>201762133</invoice0>
<invoice1>201730800</invoice1>
<invoice2>2016419446</invoice2>
<invoice3>2016388689</invoice3>
<numeroValorConta0>10208.32</numeroValorConta0>
<numeroValorConta1>10196.62</numeroValorConta1>
<numeroValorConta2>10196.62</numeroValorConta2>
<numeroValorConta3>10196.62</numeroValorConta3>
<statusFatura0>Aberto</statusFatura0>
<statusFatura1>Aberto</statusFatura1>
<statusFatura2>Fechado</statusFatura2>
<statusFatura3>Fechado</statusFatura3>
<date0>30/03/2017</date0>
<date1>28/02/2017</date1>
<date2>30/01/2017</date2>
<date3>30/12/2016</date3>
<invoiceAmmount>4</invoiceAmmount>
</xml>
编辑:这就是我的新转变的样子:
<xsl:transform exclude-result-prefixes="xs" version="2.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml"/>
<xsl:template match="xml">
<result>
<xsl:for-each select=".">
<list>
<xsl:for-each select="*[matches(name(),'invoice[0-99]')]">
<invoiceNumber>
<xsl:value-of select="."/>
</invoiceNumber>
</xsl:for-each>
<xsl:for-each select="*[matches(name(),'numeroValorConta[0-99]')]">
<totalAmmount>
<xsl:value-of select="."/>
</totalAmmount>
</xsl:for-each>
<xsl:for-each select="*[matches(name(),'statusFatura[0-99]')]">
<statusInvoice>
<xsl:value-of select="."/>
</statusInvoice>
</xsl:for-each>
<xsl:for-each select="*[matches(name(),'date[0-99]')]">
<dueDate>
<xsl:value-of select="."/>
</dueDate>
</xsl:for-each>
</list>
</xsl:for-each>
<invoiceAmmount>
<xsl:value-of select="//invoiceAmmount"/>
</invoiceAmmount>
</result>
</xsl:template>
</xsl:transform>
但它返回一个唯一的<list>
,其中包含所有元素,而不是N(发票ammount)列表,其中包含每个元素的4个信息。
我错过了什么?
答案 0 :(得分:0)
for-each
内部invoiceN
元素是上下文节点,因此您可以更改
<invoiceNumber>
<xsl:value-of select="*[matches(name(),'invoice[position()]')]"/>
</invoiceNumber>
到
<invoiceNumber>
<xsl:value-of select="."/>
</invoiceNumber>
其他元素是上下文节点的兄弟节点,因此您可以使用例如following-sibling::*[matches(name(),'numeroValorConta[0-99]')]
选择所有这些numeroValorContaN
元素,我不确定您是否要sum(following-sibling::*[matches(name(),'numeroValorConta[0-99]')])
所有这些元素,或者在separator
似乎尝试使用时单独输出它们。< / p>
如果您正在invoiceN
处理for-each
并希望找到相应的numeroValorContaN
,请使用例如
<xsl:variable name="index" as="xs:string" select="replace(local-name(), '[^0-9]+', '')"/>
<totalAmount><xsl:value-of select="following-sibling::*[local-name() = concat('numeroValorConta', $index)]"/></totalAmount>
因此,在原始代码的上下文中,您将使用
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="3.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="xml">
<result>
<xsl:for-each select="*[matches(local-name(), 'invoice[0-9]+')]">
<list>
<invoiceNumber>
<xsl:value-of select="."/>
</invoiceNumber>
<xsl:variable name="index" as="xs:string" select="replace(local-name(), '[^0-9]+', '')"/>
<totalAmount>
<xsl:value-of select="following-sibling::*[local-name() = concat('numeroValorConta', $index)]"/>
</totalAmount>
</list>
</xsl:for-each>
</result>
</xsl:template>
</xsl:stylesheet>