我是XSLT的新手,所以我相信我所寻找的是非常基础的。
我从这样的XML开始:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<record>
<id>10</id>
<version>v1</version>
<data>A Value</data>
</record>
<record>
<id>12</id>
<version>v2</version>
<data>Another Value</data>
</record>
</root>
我想做三件事:
<id>
所以结果应该是:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<record>
<id></id>
<version>v3</version>
<data>Another Value</data>
</record>
</root>
原始XML是9MB,但这提供了这个想法。
我已经找到了过滤部分,但我不确定如何同时将多个模板应用于相同的数据,如何将ID清零,以及如何在{{1中添加新值}}。新版本值只是一个静态值,所以它非常直接。
<version>
答案 0 :(得分:1)
此模板将根据您的输入XML生成所需的结果:
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" />
<xsl:template match="root">
<root>
<xsl:apply-templates select="record[version = 'v2']" />
</root>
</xsl:template>
<xsl:template match="record">
<record>
<id></id>
<version>v3</version>
<data><xsl:value-of select="data" /></data>
</record>
</xsl:template>
</xsl:stylesheet>
xsl:copy-of
不适合您想要的那种转化。 (在this网络实用程序中测试)。
答案 1 :(得分:1)
有没有办法删除
<xsl:value-of>
生成的换行符?
使用:
<data><xsl:value-of select="normalize-space(data)" /></data>
答案 2 :(得分:0)
而不是xsl:copy-of
您需要使用可更改结果的模板进行身份转换:
<!-- Process only v2 records -->
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="record[version = 'v2']"/>
</xsl:copy>
</xsl:template>
<!-- Change version -->
<xsl:template match="version">
<xsl:copy>v3</xsl:copy>
</xsl:template>
<!-- Remove ID contents -->
<xsl:template match="id">
<xsl:copy/>
</xsl:template>
<!-- Identity transformation -->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>