У меня есть исходный документ:
<?xml version="1.0"?>
<source>
<ItemNotSubstituted/>
<ItemToBeSubstituted Id='MatchId' />
</source>
И таблица стилей, содержащая контент, который я хочу заменить на источник:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml" omit-xml-declaration="no" version="1.0"/>
<xsl:preserve-space elements="//*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ItemToBeSubstituted[@Id = 'MatchId']">
<xsl:copy>
<xsl:copy-of select="@*|*"/>
<Element1/>
<Element2 Value="foo"/>
<Element3 Value="bar"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Эта таблица стилей успешно копирует <Element1/><Element2 Value="foo"/><Element3 Value="bar"/>
в ItemToBeSubstituted
. Но когда я использую другой исходный документ, в котором ItemToBeSubstituted
уже имеет содержимое:
<?xml version="1.0"?>
<source>
<ItemNotSubstituted/>
<ItemToBeSubstituted Id='MatchId'>
<Element3 Value="baz"/>
</ItemToBeSubstituted>
</source>
Я получаю этот вывод:
<?xml version="1.0"?>
<source>
<ItemNotSubstituted/>
<ItemToBeSubstituted Id="MatchId">
<Element3 Value="baz"/>
<Element1/>
<Element2 Value="foo"/>
<Element3 Value="bar"/>
</ItemToBeSubstituted>
</source>
Я бы хотел заменять только элементы из таблицы стилей, которые еще не существуют в исходном документе. Это вывод, который я ищу после применения таблицы стилей ко второму документу, используя только элемент <Element3>
из исходного документа:
<?xml version="1.0"?>
<source>
<ItemNotSubstituted/>
<ItemToBeSubstituted Id="MatchId">
<Element3 Value="baz"/>
<Element1/>
<Element2 Value="foo"/>
</ItemToBeSubstituted>
</source>
Каков наилучший подход для этого с XSL? Таблица стилей может содержать множество элементов для замены. Поэтому я не хочу использовать подход, который требует <xsl:if>
вокруг каждого элемента. Есть ли лучший способ, чем использовать одну таблицу стилей для вставки содержимого, а затем иметь вторую таблицу стилей, которая удаляет повторяющиеся элементы?