У меня есть исходный документ:XSLT Вставить элемент, если он не существует
<?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>
Эта таблица стилей succesfuly копий <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>
вокруг каждого элемента. Есть ли лучший способ, чем использовать одну таблицу стилей для вставки содержимого, а затем вторую таблицу стилей, которая удаляет повторяющиеся элементы?
+1 Это хорошее начало в этой проблеме. Он мог бы использовать немного больше обобщения вокруг того факта, что, очевидно, может быть больше элементов, которые нужно заменить, чем 'ItemToBeSubstected [@Id = 'MatchId']', но это не так сложно сделать. – Tomalak