我想对我的 xml 文件应用两个转换。首先,我想按 ID 进行分组。然后,我想做一些处理来删除特殊字符
单独地,模板工作得很好,但是当我尝试将它们放在一起时,我有一个 xml 和文本输出。我的目标是在输出中仅包含文本部分,并仅将 xml 部分保留为中间步骤。
您能指导我如何正确使用模式属性吗?我想做类似的事情
<xsl:template match="">
<xsl:apply-templates select="XML_Part"/> ---> hide from the final output
<xsl:apply-templates select="Text_Part"/>
</xsl:template>
<xsl:template match="" mode="XML_Part">
</xsl:template>
<xsl:template match="" mode="Text_Part">
</xsl:template>
XML 文件(输入)
<?xml version="1.0" encoding="UTF-8"?>
<wd:Report_Data xmlns:wd="http://www.workday.org/">
<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>
用于分组的 XSLT 模板
<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>
XSLT 删除特殊字符并显示文本部分
<xsl:template match="wd:Report_Data/wd:Report_Entry">
<xsl:value-of select="wd:id"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="translate(wd:name,'-',' ')"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="wd:price"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="wd:copy"/>
</xsl:template>
电流输出
<wd:Report_Data xmlns:wd="http://www.workday.org/">
<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</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</wd:price>
<wd:copy>0</wd:copy>
</wd:Report_Entry>
</wd:Report_Data>
1000|Call of Duty|110.12|0
2000|Metal Slug|75.00|0
3000|Need For Speed|40.00|0
预期产量
1000|Call of Duty|110.12|0
2000|Metal Slug|75.00|0
3000|Need For Speed|40.00|0
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wd="http://www.workday.org/" >
<xsl:output method="text" indent="yes"/>
<xsl:template match="/wd:Report_Data">
<xsl:for-each-group select="wd:Report_Entry" group-by="wd:id">
<xsl:value-of select="wd:id, translate(wd:name, '-', ' '), sum(current-group()/wd:price), wd:copy" separator="|"/>
<xsl:text> </xsl:text>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>