2012-04-26 13 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文書に適用::第二提供されるXML文書に適用される場合

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

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

募集、正しい結果を生成します

<foo> 
</foo> 

また、同じ正しい結果が生成されます。 identity ruleの適切な使用およびオーバーライド:

説明

+0

もう少し一般的にする方法がありますか?私が追加している要素は、例より少し複雑です。属性に基づいてではなく要素名に基づいて、サブ要素を含む要素をどのように置き換えるのですか? –

+1

@MelGerats:すべて可能です。これを明確に定義し、新しい質問として尋ねてください。私は答えてうれしい。 –

1

.NETを使用していますか?もしそうなら、特にこれらの設定変換のために何かを考えてみてください。 MSの従業員Sayed Ibrahim Hashimは、すべてのVSプロジェクトのWeb設定変換であるSlowCheetahを作成しました。

あなたの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

こんにちはトム、残念ながら私は実際の変換がどのように行われているかを制御できません –

+1

私はCMSのにおいを感じます:) – buckley

+0

私はSlowCheetahを使うことに同意します! –

関連する問題