转换列表中的枚举标记

时间:2018-03-14 18:55:22

标签: xml xslt wso2

必须转换的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个信息。 我错过了什么?

1 个答案:

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

https://xsltfiddle.liberty-development.net/pPgCcoA