2012-04-26 40 views
2

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

期望的结果:

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

我可以使用哪些模板有这个输出两个输入

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

<foo> 
</foo> 

回答

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

+0

有没有办法让这个更普遍?我添加的元素比示例稍微复杂一些。我将如何替换包含子元素的元素,而不是基于属性而是基于元素名称? – 2012-04-26 15:13:03

+1

@MelGerats:一切皆有可能。请尝试对此进行定义并提出一个新问题。我很乐意回答。 – 2012-04-26 15:15:37

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;)

+0

嗨,汤姆,不幸的是,我无法控制如何进行实际转换 – 2012-04-27 08:27:47

+1

我闻到CMS :) – buckley 2012-04-27 09:06:10

+0

我同意使用SlowCheetah! – 2012-04-28 02:41:00

相关问题