您没有明确表明您尝试自己编写 XSLT 代码。我将向您展示如何处理Expense 元素。写
- 执行身份转换以复制整个输入的模板
- 匹配第一个
Expense 元素的模板,并使其内容为其父元素的所有 Expense 子元素的总和
- 一个匹配后续
Expense 元素并且什么都不做的模板
XML 输入
假设以下格式正确的输入(在末尾添加</Employees>):
<Employees>
<Employee>
<Name>Don</Name>
<Salary>5000</Salary>
<Expense>1000</Expense>
<Expense>500</Expense>
<Expense>300</Expense>
</Employee>
<Employee>
<Name>John</Name>
<Salary>5000</Salary>
<Expense>100</Expense>
<Expense>400</Expense>
<Tax>500</Tax>
<Tax>200</Tax>
</Employee>
</Employees>
样式表
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Expense[1]">
<xsl:copy>
<xsl:value-of select="sum(../Expense)"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Expense"/>
</xsl:stylesheet>
XML 输出
<?xml version="1.0" encoding="utf-8"?>
<Employees>
<Employee>
<Name>Don</Name>
<Salary>5000</Salary>
<Expense>1800</Expense>
</Employee>
<Employee>
<Name>John</Name>
<Salary>5000</Salary>
<Expense>500</Expense>
<Tax>500</Tax>
<Tax>200</Tax>
</Employee>
</Employees>
要将这种处理应用于Employee 的任何子级,请使用类似
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*/*/*[count(../*[name() = current()/name()]) > 1 and not(preceding-sibling::*[name() = current()/name()] ) ] ">
<xsl:element name="{name()}">
<xsl:value-of select="sum(../*[name() = current()/name()])"/>
</xsl:element>
</xsl:template>
<xsl:template match="*/*/*[preceding-sibling::*[name() = current()/name()]]"/>
</xsl:stylesheet>
结果
<?xml version="1.0" encoding="utf-8"?>
<Employees>
<Employee>
<Name>Don</Name>
<Salary>5000</Salary>
<Expense>1800</Expense>
</Employee>
<Employee>
<Name>John</Name>
<Salary>5000</Salary>
<Expense>500</Expense>
<Tax>700</Tax>
</Employee>
</Employees>
并且还显示您的预期输出是错误的 - John 的工资当然应该保持 5000,而不是更改为 6000。