0
我有兩個需要以特殊方式組合的XML文檔。將兩個具有相似模式的XML文檔組合起來
舉一個簡單的例子,我就乾脆把兩個文件到一個:
<?xml version="1.0" encoding="utf-8" ?>
<data>
<config1>
<option1 type="a">A</option1>
<option2 type="b">B</option2>
<option3 type="c">C</option3>
</config1>
<config2>
<option2 type="bb">BB</option2>
<option4>D</option4>
</config2>
</data>
所以,我需要合併CONFIG1和CONFIG2這個結果:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<config>
<option1 type="a">A</option1>
<option2 type="bb">BB</option2>
<option3 type="c">C</option3>
<option4>D</option4>
</config>
</data>
轉型規則是:
- Ge從CONFIG1噸選項,如果存在CONFIG2沒有這樣的選擇
- 否則獲取該選項從CONFIG2從CONFIG2
- 獲取的選擇,如果它們不存在於CONFIG1
我製作了以下XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/*">
<xsl:copy>
<config>
<!-- Select options from config 1. -->
<xsl:for-each select="config1/*">
<xsl:choose>
<!-- Leave option as is. -->
<xsl:when test="not(/data/config2/*[name() = name(current())])">
<xsl:copy-of select="."/>
</xsl:when>
<!-- Overwrite option. -->
<xsl:otherwise>
<xsl:copy-of select="/data/config2/*[name() = name(current())]"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
<!-- Select options from config 2. -->
<xsl:for-each select="config2/*">
<!-- Append "new" option -->
<xsl:if test="not(/data/config1/*[name()=name(current())])">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</config>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
它的工作,但看起來跛腳。
很多XSL大師更喜歡apply-templates for for-each。
是否有可能以這種方式重寫我的模板?