Это преобразование:
<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.
Есть ли способ сделать это более общим? Элемент, который я добавляю, немного сложнее, чем пример. Как заменить элемент, содержащий подэлементы, не на основе атрибута, а на основе имени элемента? –
@MelGerats: Все возможно. Пожалуйста, постарайтесь определить эту проблему и задать новый вопрос. Я буду рад ответить. –