几个简单的XSLT更改

时间:2011-06-02 20:04:39

标签: xml xslt

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

我想做三件事:

  • 过滤以便我只看到v2结果
  • 清空<id>
  • 将“v2”替换为“v3”

所以结果应该是:

<?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>

3 个答案:

答案 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>