使用 2 个不同元素的 XSLT 组
XSLT Group by using 2 different elements
我是 xslt 新手。我正在尝试按 2 个不同的元素进行分组。首先通过 Worker,然后通过 Pay 代码。请参阅按付款代码分组的金额总和。下面是之前的示例 xsl,然后是我希望作为输出的 xsl 之后的示例。
之前:
<?xml version='1.0' encoding='utf-8'?>
<File xmlns:is="java:com.workday.esb.intsys.xpath.ParsedIntegrationSystemFunctions"
xmlns:tv="java:com.workday.esb.intsys.TypedValue">
<Worker>
<Detail>
<EmployeeID>0008765</EmployeeID>
<FirstName>ROBERT</FirstName>
<PayCode>RSVEST</PayCode>
<Amount>5572.800000</Amount>
</Detail>
<Detail>
<EmployeeID>0008765</EmployeeID>
<FirstName>ROBERT</FirstName>
<PayCode>FICA</PayCode>
<Amount>40.000000</Amount>
</Detail>
</Worker>
<Worker>
<Detail>
<EmployeeID>0008765</EmployeeID>
<FirstName>ROBERT</FirstName>
<PayCode>RSVEST</PayCode>
<Amount>13545.000000</Amount>
</Detail>
</Worker>
<Worker>
<Detail>
<EmployeeID>00012345</EmployeeID>
<FirstName>RUSSELL</FirstName>
<PayCode>RSVEST</PayCode>
<Amount>84811.050000</Amount>
</Detail>
</Worker>
</File>
我想要的输出,首先按 Worker 分组,然后按 Pay Code 分组。由于分组的金额总和:
<?xml version='1.0' encoding='utf-8'?>
<File xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tv="java:com.workday.esb.intsys.TypedValue">
<Worker>
<Detail>
<EmployeeID>0008765</EmployeeID>
<FirstName>ROBERT</FirstName>
<PayCode>RSVEST</PayCode>
<Amount>19117.800000</Amount>
</Detail>
<Detail>
<EmployeeID>0008765</EmployeeID>
<FirstName>ROBERT</FirstName>
<PayCode>FICA</PayCode>
<Amount>40.000000</Amount>
</Detail>
</Worker>
<Worker>
<Detail>
<EmployeeID>00012345</EmployeeID>
<FirstName>RUSSELL</FirstName>
<PayCode>RSVEST</PayCode>
<Amount>84811.050000</Amount>
</Detail>
</Worker>
</File>
下面是我的 XSL 不起作用:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" exclude-result-prefixes="xsl wd xsd this env"
xmlns:wd="urn:com.workday/bsvc"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:this="urn:this-stylesheet">
<xsl:output indent="yes" method="xml"/>
<xsl:template match="/">
<File>
<Worker>
<xsl:for-each-group select="File" group-by="Worker">
<Detail>
<EmployeeID><xsl:value-of select="Worker/current-group()/EmployeeID"></xsl:value-of></EmployeeID>
<FirstName><xsl:value-of select="//current-group()//FirstName"></xsl:value-of></FirstName>
<PayCode><xsl:value-of select="PayCode"></xsl:value-of></PayCode>
<Amount><xsl:value-of select="format-number(sum(current-group()/number(translate(Amount,',',''))),'######.00')"></xsl:value-of></Amount>
</Detail>
</xsl:for-each-group>
</Worker>
</File>
</xsl:template>
</xsl:stylesheet>
有人可以放一个 SL 将上面的转换为所需的输出吗?
我已经为此工作了几个小时,挥舞着白旗哈哈。
谢谢!
如果你想为每个 EmployeeID
建立一个组,并且在每个这样的组中为每个 PayCode
建立一个子组,那么显然你需要嵌套 two xsl:for-each-group
说明。您需要分组的节点是 Detail
元素,而不是只有一个的根 File
元素。
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/File">
<xsl:copy>
<xsl:for-each-group select="Worker/Detail" group-by="EmployeeID">
<Worker>
<xsl:for-each-group select="current-group()" group-by="PayCode">
<Detail>
<xsl:copy-of select="EmployeeID | FirstName | PayCode"/>
<Amount>
<xsl:value-of select="format-number(sum(current-group()/Amount),'#.000000')"/>
</Amount>
</Detail>
</xsl:for-each-group>
</Worker>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我是 xslt 新手。我正在尝试按 2 个不同的元素进行分组。首先通过 Worker,然后通过 Pay 代码。请参阅按付款代码分组的金额总和。下面是之前的示例 xsl,然后是我希望作为输出的 xsl 之后的示例。
之前:
<?xml version='1.0' encoding='utf-8'?>
<File xmlns:is="java:com.workday.esb.intsys.xpath.ParsedIntegrationSystemFunctions"
xmlns:tv="java:com.workday.esb.intsys.TypedValue">
<Worker>
<Detail>
<EmployeeID>0008765</EmployeeID>
<FirstName>ROBERT</FirstName>
<PayCode>RSVEST</PayCode>
<Amount>5572.800000</Amount>
</Detail>
<Detail>
<EmployeeID>0008765</EmployeeID>
<FirstName>ROBERT</FirstName>
<PayCode>FICA</PayCode>
<Amount>40.000000</Amount>
</Detail>
</Worker>
<Worker>
<Detail>
<EmployeeID>0008765</EmployeeID>
<FirstName>ROBERT</FirstName>
<PayCode>RSVEST</PayCode>
<Amount>13545.000000</Amount>
</Detail>
</Worker>
<Worker>
<Detail>
<EmployeeID>00012345</EmployeeID>
<FirstName>RUSSELL</FirstName>
<PayCode>RSVEST</PayCode>
<Amount>84811.050000</Amount>
</Detail>
</Worker>
</File>
我想要的输出,首先按 Worker 分组,然后按 Pay Code 分组。由于分组的金额总和:
<?xml version='1.0' encoding='utf-8'?>
<File xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tv="java:com.workday.esb.intsys.TypedValue">
<Worker>
<Detail>
<EmployeeID>0008765</EmployeeID>
<FirstName>ROBERT</FirstName>
<PayCode>RSVEST</PayCode>
<Amount>19117.800000</Amount>
</Detail>
<Detail>
<EmployeeID>0008765</EmployeeID>
<FirstName>ROBERT</FirstName>
<PayCode>FICA</PayCode>
<Amount>40.000000</Amount>
</Detail>
</Worker>
<Worker>
<Detail>
<EmployeeID>00012345</EmployeeID>
<FirstName>RUSSELL</FirstName>
<PayCode>RSVEST</PayCode>
<Amount>84811.050000</Amount>
</Detail>
</Worker>
</File>
下面是我的 XSL 不起作用:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" exclude-result-prefixes="xsl wd xsd this env"
xmlns:wd="urn:com.workday/bsvc"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:this="urn:this-stylesheet">
<xsl:output indent="yes" method="xml"/>
<xsl:template match="/">
<File>
<Worker>
<xsl:for-each-group select="File" group-by="Worker">
<Detail>
<EmployeeID><xsl:value-of select="Worker/current-group()/EmployeeID"></xsl:value-of></EmployeeID>
<FirstName><xsl:value-of select="//current-group()//FirstName"></xsl:value-of></FirstName>
<PayCode><xsl:value-of select="PayCode"></xsl:value-of></PayCode>
<Amount><xsl:value-of select="format-number(sum(current-group()/number(translate(Amount,',',''))),'######.00')"></xsl:value-of></Amount>
</Detail>
</xsl:for-each-group>
</Worker>
</File>
</xsl:template>
</xsl:stylesheet>
有人可以放一个 SL 将上面的转换为所需的输出吗?
我已经为此工作了几个小时,挥舞着白旗哈哈。
谢谢!
如果你想为每个 EmployeeID
建立一个组,并且在每个这样的组中为每个 PayCode
建立一个子组,那么显然你需要嵌套 two xsl:for-each-group
说明。您需要分组的节点是 Detail
元素,而不是只有一个的根 File
元素。
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/File">
<xsl:copy>
<xsl:for-each-group select="Worker/Detail" group-by="EmployeeID">
<Worker>
<xsl:for-each-group select="current-group()" group-by="PayCode">
<Detail>
<xsl:copy-of select="EmployeeID | FirstName | PayCode"/>
<Amount>
<xsl:value-of select="format-number(sum(current-group()/Amount),'#.000000')"/>
</Amount>
</Detail>
</xsl:for-each-group>
</Worker>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>