2012-04-26 39 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

相關問題