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>
我的 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>