2012-12-13 26 views
2

我對XSLT是全新的,請耐心等待。XSLT副本無重複

我有兩個xml文件,我試圖使用XSLT連接在一起。我想合併這些文件,以便在第二個文件中指定的任何值覆蓋第一個文件。例如。

firstFile.xml

<person> 
    <person-name>Sandy</person-name> 
    <person-age>21</person-age> 
</person> 

<person> 
    <person-name>Bob</person-name> 
    <person-age>15</person-age> 
</person> 

Override.xml的

<person> 
    <person-name>Bob</person-name> 
    <person-age>21</person-age> 
</person> 

結果:

<person> 
    <person-name>Sandy</person-name> 
    <person-age>21</person-age> 
</person> 
<person> 
    <person-name>Bob</person-name> 
    <person-age>21</person-age> 
</person> 

我的模板FO [R串聯的2個文件如下:

<xsl:template match="/"> 
    <!-- MainFile --> 
    <xsl:copy-of select="/*"/> 

     <!-- Overrides--> 
     <xsl:copy-of select="document($overrideFile)/*"/> 
    </xsl:template> 

我試圖安裝一個for-each循環,使得每一個複製人firstFile.xml前檢查是否有在Override.xml的相應節點,但不成功。

任何提示,將不勝感激

回答

3

該轉化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pDoc2Url" select="'file:///c:/temp/delete/override.xml'"/> 
<xsl:variable name="vDoc2" select="document($pDoc2Url)"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/*"> 
    <t> 
    <xsl:apply-templates 
     select="person[not(person-name = $vDoc2/*/person/person-name)]"/> 
    <xsl:apply-templates select="$vDoc2/*/person"/> 
    </t> 
</xsl:template> 
</xsl:stylesheet> 

當施加在第一所提供的XML文檔(包裹成一個單一的頂部元件的 - 將被製成一個格式良好的XML文檔):

<t> 
    <person> 
     <person-name>Sandy</person-name> 
     <person-age>21</person-age> 
    </person> 
    <person> 
     <person-name>Bob</person-name> 
     <person-age>15</person-age> 
    </person> 
</t> 

並作爲參數傳遞的文件名,其中第二文件(再次裹成頂部元件)駐留 - 這裏是修正後的第二文檔

C:/temp/delete/override.xml

<t> 
    <person> 
     <person-name>Bob</person-name> 
     <person-age>21</person-age> 
    </person> 
</t> 

產生想要的,正確的結果:

<t> 
    <person> 
     <person-name>Sandy</person-name> 
     <person-age>21</person-age> 
    </person> 
    <person> 
     <person-name>Bob</person-name> 
     <person-age>21</person-age> 
    </person> 
</t> 

二,較短,但不靈活的解決方案 - 沒有身份的規則,沒有xsl:apply-templates

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pDoc2Url" select="'file:///c:/temp/delete/override.xml'"/> 
<xsl:variable name="vDoc2" select="document($pDoc2Url)"/> 

<xsl:template match="/*"> 
    <t> 
    <xsl:copy-of 
     select="person[not(person-name = $vDoc2/*/person/person-name)]"/> 
    <xsl:copy-of select="$vDoc2/*/person"/> 
    </t> 
</xsl:template> 
</xsl:stylesheet> 
+0

由於一噸Dimitre!出於某種原因,我的大腦很難在XSLT中思考!調試對我來說也不是那麼容易,我一直試圖使用IntelliJ + XSLT調試器沒有成功。 –

+1

@DerekGourlay,不客氣。有不同的XSLT IDE。對於XSLT 1.0,可以使用MS Visual Studio XML Editor和XSLT Debugger。我正在使用另一個 - XSelerator。許多人使用提供XSLT 2.0和XSLT 1.0調試器的oXygen - 使用Saxon。 –