XSLT 中不同标签值的循环和求和值

Looping and summing values from a different tag values in XSLT

我的 XSLT 有问题,摘要中的总计不会显示,谁能帮我解决这个问题。

我有这个XML

<?xml version="1.0" encoding="utf-8"?>
<Document>
  <Header>
    <Year>2019</Year>
    <Month>08</Month>
    <DocNumber>1</DocNumber>
    <Company>
      <Name>My Company</Name>
      <City>City</City>
      <Country>Country</Country>
    </Company>
    <Items>
      <Item>
        <Type>A</Type>
        <Name>Item 2</Name>
        <Amount>20</Amount>
        <Quantity>2</Quantity>
        <Discount>3</Discount>
      </Item>
      <Item>
        <Type>B</Type>
        <Name>Item 3</Name>
        <Amount>40</Amount>
        <Quantity>1</Quantity>
        <Discount>3</Discount>
      </Item>
      <Item>
        <Type>C</Type>
        <Name>Item 1</Name>
        <Amount>30</Amount>
        <Quantity>2</Quantity>
        <Discount>4</Discount>
      </Item>
    </Items>
  </Header>
</Document>

还有这个 XSLT 1.0

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="xml" indent="yes"/>
  <xsl:variable name="noDisplay" select="'|B|D|'" />

  <xsl:template match="Document">
    <Root>
      <xsl:apply-templates select="Header" />
    </Root>
  </xsl:template>

  <xsl:template match="Header">
    <xsl:variable name="iTotQty" select ="sum(Items/Item/Quantity)" />
    <xsl:variable name="iTotAmt" select ="sum(Items/Item/Amount)" />
    <xsl:variable name="iTotDisc" select ="sum(Items/Item/Discount)" />
    <Summary>
      <xsl:attribute name="Year">
        <xsl:value-of select ="Year" />
      </xsl:attribute>
      <xsl:attribute name="Month">
        <xsl:value-of select ="Month" />
      </xsl:attribute>
      <xsl:attribute name="Number">
        <xsl:value-of select ="DocNumber" />
      </xsl:attribute>
      <xsl:attribute name="Number">
        <xsl:value-of select ="DocNumber" />
      </xsl:attribute>
      <xsl:attribute name="Number">
        <xsl:value-of select ="DocNumber" />
      </xsl:attribute>
      <xsl:attribute name="Number">
        <xsl:value-of select ="DocNumber" />
      </xsl:attribute>
      <xsl:attribute name="TotalQty">
        <xsl:value-of select ="$iTotQty" />
      </xsl:attribute>
      <xsl:attribute name="TotalAmt">
        <xsl:value-of select ="$iTotAmt" />
      </xsl:attribute>
      <xsl:attribute name="TotalDisc">
        <xsl:value-of select ="$iTotDisc" />
      </xsl:attribute>
      <xsl:apply-templates select="Items/Item" />
    </Summary>
  </xsl:template>

  <xsl:template match="Items/Item">
    <xsl:variable name="bNoDisplay" select ="contains($noDisplay, concat('|', Type, '|'))" />
    <Item>
      <xsl:attribute name="Type">
        <xsl:value-of select ="Type" />
      </xsl:attribute>
      <xsl:attribute name="Name">
        <xsl:value-of select ="Name" />
      </xsl:attribute>
      <xsl:if test ="not($bNoDisplay)">
        <xsl:attribute name="Qty">
          <xsl:value-of select ="Quantity" />
        </xsl:attribute>
        <xsl:attribute name="Amt">
          <xsl:value-of select ="Amount" />
        </xsl:attribute>
        <xsl:attribute name="Disc">
          <xsl:value-of select ="Discount" />
        </xsl:attribute>
      </xsl:if>
    </Item>
  </xsl:template>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

结果是:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Summary Year="2019" Month="08" Number="1" TotalQty="5" TotalAmt="90" TotalDisc="10">
    <Item Type="A" Name="Item 2" Qty="2" Amt="20" Disc="3" />
    <Item Type="B" Name="Item 3" />
    <Item Type="C" Name="Item 1" Qty="2" Amt="30" Disc="4" />
  </Summary>
</Root>

汇总的条件是它应该只汇总项目中显示的所有数据(数量、金额和折扣),如果未显示,则不应作为总和的一部分,如果数据(数量、金额和折扣)根本不包含任何内容或结果为 0,则不应显示

我只能使用 XSLT 1.0 所以任何人都可以更正我的样式表,谢谢

考虑以下样式表,将其最小化以解决您的已编辑问题中出现的问题:

XSLT 1.0

<xsl:stylesheet version="1.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:param name="noDisplay" select="'|B|D|'" />

<xsl:template match="/Document">
    <Root>
        <xsl:apply-templates select="Header" />
    </Root>
</xsl:template>

<xsl:template match="Header">
    <xsl:variable name="displayed-items" select="Items/Item[not(contains($noDisplay, concat('|', Type, '|')))]" />
    <Summary Year="{Year}" Month="{Month}" Number="{DocNumber}" TotalQty="{sum($displayed-items/Quantity)}" TotalAmt="{sum($displayed-items/Amount)}" TotalDisc="{sum($displayed-items/Discount)}">
        <!-- omitted -->
    </Summary>
</xsl:template>

</xsl:stylesheet>

当应用于您输入的 XML 示例时,结果将是:

结果

<?xml version="1.0" encoding="UTF-8"?>
<Root>
  <Summary Year="2019" Month="08" Number="1" TotalQty="4" TotalAmt="50" TotalDisc="7"/>
</Root>