我正在使用XSLT应用配置转换。我想添加一个元素,如果它不存在,或者覆盖它,如果它存在。如何使用XSLT添加或替换元素
期望的结果:
<foo>
<bar value="baz" />
</foo>
我可以使用哪些模板有这个输出两个输入
<foo>
<bar value="123" />
</foo>
和
<foo>
</foo>
我正在使用XSLT应用配置转换。我想添加一个元素,如果它不存在,或者覆盖它,如果它存在。如何使用XSLT添加或替换元素
期望的结果:
<foo>
<bar value="baz" />
</foo>
我可以使用哪些模板有这个输出两个输入
<foo>
<bar value="123" />
</foo>
和
<foo>
</foo>
这种转变:
<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。
您使用的是.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;)
嗨,汤姆,不幸的是,我无法控制如何进行实际转换 – 2012-04-27 08:27:47
我闻到CMS :) – buckley 2012-04-27 09:06:10
我同意使用SlowCheetah! – 2012-04-28 02:41:00
有没有办法让这个更普遍?我添加的元素比示例稍微复杂一些。我将如何替换包含子元素的元素,而不是基于属性而是基于元素名称? – 2012-04-26 15:13:03
@MelGerats:一切皆有可能。请尝试对此进行定义并提出一个新问题。我很乐意回答。 – 2012-04-26 15:15:37