XSLT:应用 xml 转换,然后进行另一个文本转换

问题描述 投票:0回答:1
尽管有多个线程解释了在同一 xslt 文件中使用多个模板,但我找不到解决我的问题的解决方案。

我想对我的 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
    
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="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>&#10;</xsl:text> </xsl:for-each-group> </xsl:template> </xsl:stylesheet>
    
© www.soinside.com 2019 - 2024. All rights reserved.