XSL не может заменить ничего. Лучшее, что вы можете сделать, это скопировать части, которые вы хотите сохранить, а затем вывести части, которые вы хотите изменить, вместо частей, которые вы не хотите сохранять.
Пример:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<!-- This is an identity template - it copies everything
that doesn't match another template -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- This is the "other template". It says to use your BBB-DDD elements
instead of the AAA element -->
<xsl:template match="criterion[.='AAA']">
<xsl:element name="criterion">
<xsl:text>BBB</xsl:text>
</xsl:element>
<xsl:element name="criterion">
<xsl:text>CCC</xsl:text>
</xsl:element>
<xsl:element name="criterion">
<xsl:text>DDD</xsl:text>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Соответствие шаблона @* | node()
соответствует любому атрибуту или любому другому виду узла. Хитрость в том, что у шаблонных совпадений есть приоритеты. Вы можете думать о правиле как о «более конкретном совпадении». Что-нибудь будет более конкретным, чем "любой атрибут или другой узел". Это делает «идентичность» совпадающей с очень низким приоритетом.
Когда соответствует , он просто копирует любые узлы, которые он находит внутри соответствующего атрибута или узла.
Любые другие ваши шаблоны будут иметь более высокий приоритет. Независимо от того, что они соответствуют, это код внутри более конкретного шаблона, который будет иметь эффект. Например, если вы просто удалили все внутри шаблона criterion[.='AAA']
, вы обнаружите, что вы точно скопировали свои данные, кроме элемента «AAA».