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

Есть ли способ сделать это более общим? Элемент, который я добавляю, немного сложнее, чем пример. Как заменить элемент, содержащий подэлементы, не на основе атрибута, а на основе имени элемента? –

+1

@MelGerats: Все возможно. Пожалуйста, постарайтесь определить эту проблему и задать новый вопрос. Я буду рад ответить. –

1

Вы используете .NET? Если это так, вы можете рассмотреть что-то специально для этих преобразований конфигурации. Сотрудник MS Sayed Ibrahim Hashim создал SlowCheetah, который преобразует веб-конфигурацию для всех проектов VS.

Your 2 сценариев становятся:

<foo> 
    <bar xdt:Transform="Replace" value="123" /> 
</foo> 

<foo xdt:Transform="Replace"> 
</foo> 

XSLT немного многословным ИМО. 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! –

Смежные вопросы