如何使用XSLT添加或替换元素

时间:2012-04-26 12:07:20

标签: xslt

我正在使用XSLT来应用配置转换。我想添加一个元素,如果它不存在,或者如果它存在则覆盖它。

期望的结果:

<foo>
    <bar value="baz" />        
</foo>

我可以使用什么模板为两个输入都输出

<foo>
    <bar value="123" />        
</foo>

<foo>
</foo>

2 个答案:

答案 0 :(得分:1)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="foo/bar/@value[.='123']">
  <xsl:attribute name="value">baz</xsl:attribute>
 </xsl:template>

 <xsl:template match="foo[not(bar)]">
  <foo>
    <bar value="baz"/>
  </foo>
 </xsl:template>
</xsl:stylesheet>

应用于第一个提供的XML文档

<foo>
    <bar value="123" />
</foo>

生成想要的正确结果

<foo>
   <bar value="baz"/>
</foo>

应用于第二个提供的XML文档时:

<foo>
</foo>

它也会产生相同的正确结果

解释:正确使用和覆盖 identity rule

答案 1 :(得分:1)

您使用的是.NET吗?如果是这样,你可以考虑特别为这些配置转换做的事情。 MS员工Sayed Ibrahim Hashim创建了SlowCheetah,这是所有VS项目的Web配置转换。

然后你的2个场景变为:

<foo>
  <bar xdt:Transform="Replace" value="123" />
</foo>

<foo xdt:Transform="Replace">
</foo>

Xslt有点冗长的IMO。 Hansleman有一个post

有关不同转换的文档可以在http://go.microsoft.com/fwlink/?LinkId=214134

找到

SlowCheetah扩展程序添加了一个目标,您可以将其复制到项目中以使其自包含

在Codeplex上,如果要将其用作exe或在名为Transform Config的代码中执行,则还有一个简单的项目。

PS。 Tom van Orbit One hier;)