我正在使用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