首页 > 解决方案 > 基于参数的 XSLT 动态求和

问题描述

我从 Apache Camel 调用此 XSL,并将消息的标头设置为参数,但仍然没有得到结果。

我想要一个 XSLT,它根据参数给我总和问题是参数可能是多个值或一个值

<EmpJob>
<EmpJob>
<userId>testID</userId>
<EmpPayCompRecurring>
            <payComponent>1010</payComponent>
            <endDate>2020-06-30T00:00:00.000</endDate>
            <paycompvalue>3025.67</paycompvalue>
            <userId>testID</userId>
            <currencyCode>EUR</currencyCode>
            <startDate>2020-06-01T00:00:00.000</startDate>
        </EmpPayCompRecurring>
 <EmpPayCompRecurring>
            <payComponent>6097</payComponent>
            <endDate>2019-12-31T00:00:00.000</endDate>
            <paycompvalue>100.0</paycompvalue>
            <userId>testID</userId>
            <currencyCode>EUR</currencyCode>
            <startDate>2018-12-06T00:00:00.000</startDate>
        </EmpPayCompRecurring>
</EmpJob>
</EmpJob>

我创建了一个 XSLT 转换

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name = "custReturnDate" />
    <xsl:template match="/EmpJob">
        
         <xsl:variable name="apos">'</xsl:variable>
<xsl:variable name="payrecur">'1010','6097' </xsl:variable>

     <mainroot>
     <xsl:for-each select="EmpJob">
            <root>
                    <__metadata>
                      
                        <uri><xsl:value-of select="concat('EmpCompensation(seqNumber=1L,startDate=datetime',$apos ,$custReturnDate, $apos,',userId=',$apos,userId,$apos,')')"/></uri>
                    </__metadata>
                  
                    <customDouble13><xsl:value-of select="sum(EmpPayCompRecurring[$payrecur]/paycompvalue) "/></customDouble13>

                </root>
           
     
        </xsl:for-each>
    </mainroot>
    </xsl:template>
</xsl:stylesheet>

“payrecur”应该是稍后根据这个参数我应该对节点值求和的参数。

PS我可以将参数更改为任何内容,因为我是从代码中调用模板。

标签: xsltxml-parsingapache-camelxslt-2.0

解决方案


给定 XSLT 2 或 3,我会将参数声明为字符串或整数序列,然后进行比较sum(EmpPayCompRecurring[payComponent = $payrecur]/paycompvalue)

所以声明例如<xsl:param name="payrecur" as="xs:string*" select="'1010','6097'"/>

一个最小的样式表将是

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:param name = "custReturnDate" />
    
    <xsl:param name="payrecur" as="xs:string*" select="'1010','6097'"/>
    
    <xsl:output indent="yes"/>
    
    <xsl:template match="/EmpJob">
        
         <xsl:variable name="apos">'</xsl:variable>

     <mainroot>
     <xsl:for-each select="EmpJob">
            <root>
                    <__metadata>
                      
                        <uri><xsl:value-of select="concat('EmpCompensation(seqNumber=1L,startDate=datetime',$apos ,$custReturnDate, $apos,',userId=',$apos,userId,$apos,')')"/></uri>
                    </__metadata>
                  
                    <customDouble13>
                        <xsl:value-of select="sum(EmpPayCompRecurring[payComponent = $payrecur]/paycompvalue)"/>
                        </customDouble13>

                </root>
           
     
        </xsl:for-each>
    </mainroot>
    </xsl:template>
</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/bEzkTcM我得到<customDouble13>3125.67</customDouble13>. 您可能想要添加元素exclude-result-prefixes="#all"xsl:stylesheet


推荐阅读