Рассмотрим XML нижеXSLT 2.0 удалить элементы на основе имени атрибута и добавить набор элементов вместо
<?xml version="1.0" encoding="UTF-8"?>
<p >
<node>
<e a="1"/>
<e a="2"/>
</node>
<a>
<c value="-3" v="RRR_1"/>
<c value="1" v="RRR_2"/>
<c value="11" v="v1"/>
<c value="12" v="v2"/>
</a>
</p>
Я хотел бы найти все гр элементы, v значений атрибутов начинаются с RRR и удалить их Тогда Я хотел бы добавить в конце следующие узлы гр
<c value="123" v="RRR_134"/>
<c value="456" v="RRR_233"/>
<c value="789" v="RRR_900"/>
Таким образом, окончательный XML выглядит как
<?xml version="1.0" encoding="UTF-8"?>
<p >
<node>
<e a="1"/>
<e a="2"/>
</node>
<a>
<c value="11" v="v1"/>
<c value="12" v="v2"/>
<c value="123" v="RRR_134"/>
<c value="456" v="RRR_233"/>
<c value="789" v="RRR_900"/>
</a>
</p>
Я написал следующий XSL, чтобы удалить узлы c с атрибутом v, начиная с RRR - однако как мне изменить один и тот же XSL, чтобы также добавить необходимые элементы в конце. Я могу написать еще один лист XSL, но задаюсь вопросом, можно ли это сделать в том же файле XSLT.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/p/a/c[starts-with(@v, 'RRR')]"></xsl:template>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- remove new lines for a deleted element -->
<xsl:template match="*/text()[normalize-space()]">
<xsl:value-of select="normalize-space()"/>
</xsl:template>
</xsl:stylesheet>
Perfect - спасибо @matthias_h! –