XSLT:根据条件求和并删除xml节点

问题描述 投票:0回答:1

我目前正在进行一项棘手的转换,其中我需要在文章出现两次时对游戏文章的价格值进行求和,并从输出中排除第二篇文章。

说明:每篇文章都有 id、名称、价格和副本号。就我而言,我总是有两份。 复制 0复制 1。如果一篇文章有两份,那么我们将文章 copy 1 的价格添加到文章 copy 0 中,并从输出中排除 copy 1

我不太确定如何满足这个要求。

XML 输入

<?xml version="1.0" encoding="UTF-8"?>
<wd:Report_Data>
  <wd:Report_Entry>
    <wd:id>1000</wd:id>
    <wd:name>Call of Duty</wd:name>
    <wd:price>50.12</wd:price>
    <wd:copy>0</wd:copy>
  </wd:Report_Entry>
  <wd:Report_Entry>
    <wd:id>1000</wd:id>
    <wd:name>Call of Duty</wd:name>
    <wd:price>60.0</wd:price>
    <wd:copy>1</wd:copy>
  </wd:Report_Entry>
  <wd:Report_Entry>
    <wd:id>2000</wd:id>
    <wd:name>Metal Slug</wd:name>
    <wd:price>75.00</wd:price>
    <wd:copy>0</wd:copy>
  </wd:Report_Entry>
  <wd:Report_Entry>
    <wd:id>3000</wd:id>
    <wd:name>Need For Speed</wd:name>
    <wd:price>40.00</wd:price>
    <wd:copy>0</wd:copy>
  </wd:Report_Entry>
</wd:Report_Data>

预期的 XML 输出:

<?xml version="1.0" encoding="UTF-8"?>
<wd:Report_Data>
  <wd:Report_Entry>
    <wd:id>1000</wd:id>
    <wd:name>Call of Duty</wd:name>
    <wd:price>110.12</wd:price>
    <wd:copy>0</wd:copy>
  </wd:Report_Entry>
  <wd:Report_Entry>
    <wd:id>2000</wd:id>
    <wd:name>Metal Slug</wd:name>
    <wd:price>75.00</wd:price>
    <wd:copy>0</wd:copy>
  </wd:Report_Entry>
  <wd:Report_Entry>
    <wd:id>3000</wd:id>
    <wd:name>Need For Speed</wd:name>
    <wd:price>40.00</wd:price>
    <wd:copy>0</wd:copy>
  </wd:Report_Entry>
</wd:Report_Data>

按照@michael.hor257k 的建议,我能够创建一个分组结构并对价格进行求和。然而我还是没有得到预期的结果

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:wd="http://www.workday.org/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:template match="/">
            <xsl:for-each-group select="wd:Report_Data/wd:Report_Entry" group-by="wd:id">
                <xsl:copy>
                    <xsl:copy-of select="wd:id"/>
                    <xsl:copy-of select="wd:name"/>
                    <wd:price>
                        <xsl:value-of select="sum(current-group()/wd:price)" />
                    </wd:price>                 
                    <xsl:copy-of select="wd:copy"/>
                </xsl:copy>
            </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>

结果(不是我想要的)

<wd:Report_Entry xmlns:wd="http://www.workday.org/">
   <wd:id>1000</wd:id>
   <wd:name>Call of Duty</wd:name>
   <wd:price xmlns:xs="http://www.w3.org/2001/XMLSchema">110.12</wd:price>
   <wd:copy>0</wd:copy>
</wd:Report_Entry>
<wd:Report_Entry xmlns:wd="http://www.workday.org/">
   <wd:id>2000</wd:id>
   <wd:name>Metal Slug</wd:name>
   <wd:price xmlns:xs="http://www.w3.org/2001/XMLSchema">75</wd:price>
   <wd:copy>0</wd:copy>
</wd:Report_Entry>
<wd:Report_Entry xmlns:wd="http://www.workday.org/">
   <wd:id>3000</wd:id>
   <wd:name>Need For Speed</wd:name>
   <wd:price xmlns:xs="http://www.w3.org/2001/XMLSchema">40</wd:price>
   <wd:copy>0</wd:copy>
</wd:Report_Entry>
xml xslt xslt-2.0 xslt-grouping
1个回答
0
投票

您只需要做一些小改变:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:wd="http://www.workday.org/">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/wd:Report_Data">
    <xsl:copy>
        <xsl:for-each-group select="wd:Report_Entry" group-by="wd:id">
            <xsl:copy>
                <xsl:copy-of select="wd:id"/>
                <xsl:copy-of select="wd:name"/>
                    <wd:price>
                        <xsl:value-of select="sum(current-group()/wd:price)" />
                    </wd:price>                 
                <xsl:copy-of select="wd:copy"/>
            </xsl:copy>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.