它我有一個源文件: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這是問題的良好開端。它可以使用一個更普遍的事實,顯然可能有更多的元素被替換爲比ItemToBeSubstituted [@Id ='MatchId']`,但這不是很難做到。 – Tomalak 2009-08-05 09:45:14