2014-01-14 60 views
0

我想對兩個源執行XSLT。將兩個源映射到一個輸出

Sourch_1.xml:

<Root> 
<record> 
    <PolicyNumber>1</PolicyNumber> 
    <FirdsName>aa</FirdsName> 
    <LastName>aa</LastName> 
</record> 
<record> 
    <PolicyNumber>2</PolicyNumber> 
    <FirdsName>bb</FirdsName> 
    <LastName>bb</LastName> 
</record> 

Sourch_2.xml:

<Root> 
<record> 
    <policy> 
     <PolicyNumber>1</PolicyNumber> 
     <city>aaCity</city> 
     <street>aaStreet</street> 
    </policy> 
    <policy> 
     <PolicyNumber>2</PolicyNumber> 
     <city>bbCity</city> 
     <street>bbStreet</street> 
    </policy> 
</record> 

我所要的輸出創造出兩個來源基於PolicyNumber結合數據標籤。

我希望我的輸出是:

的Output.xml:

<Root> 
<record_data> 
    <PolicyNumber>1</PolicyNumber> 
    <FirdsName>aa</FirdsName> 
    <LastName>aa</LastName> 
    <city>aaCity</city> 
    <street>aaStreet</street> 
</record_data> 
<record_data> 
    <PolicyNumber>2</PolicyNumber> 
    <FirdsName>bb</FirdsName> 
    <LastName>bb</LastName> 
    <city>bbCity</city> 
    <street>bbStreet</street> 
</record_data> 

我怎麼能做到,使用XSLT?

回答

1

要處理多個XML輸入文件,請使用document()功能。確保其他XML文件也位於放置XSLT樣式表的文件夾中。

值得你注意行如下:

<xsl:for-each select="document('double2.xml')/root/record/policy[./PolicyNumber=current()/PolicyNumber]"> 

首先,document('double2.xml')打開第二XML文件(我曾經戲稱它是「double2.xml」)。對於在該第二XML文件policy元件它檢查其PolicyNumber是否等於從所述第一XML文件record元件正在被處理的PolicyNumber


我稍微修改您的輸入,使之良好形成(降低了root元素並添加了結束標記)。請注意,其中還有一個拼寫錯誤,您可能打算寫「FirstName」而不是「FirdsName」。

樣式

<?xml version="1.0" encoding="utf-8"?> 

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" indent="yes"/> 

<xsl:template match="/root"> 
    <xsl:copy> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="record"> 
    <record_data> 
    <xsl:copy-of select="*"/> 
    <xsl:for-each select="document('double2.xml')/root/record/policy[./PolicyNumber=current()/PolicyNumber]"> 
     <xsl:copy-of select="city|street"/> 
    </xsl:for-each> 
    </record_data> 
</xsl:template> 

</xsl:stylesheet> 

輸出

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
<record_data> 
    <PolicyNumber>1</PolicyNumber> 
    <FirdsName>aa</FirdsName> 
    <LastName>aa</LastName> 
    <city>aaCity</city> 
    <street>aaStreet</street> 
</record_data> 
<record_data> 
    <PolicyNumber>2</PolicyNumber> 
    <FirdsName>bb</FirdsName> 
    <LastName>bb</LastName> 
    <city>bbCity</city> 
    <street>bbStreet</street> 
</record_data> 
</root> 
-1

下面的東西會適合你。

注意:我還沒有運行此代碼。在那裏我檢查not(policy)你可能會做一些改變的XPath像not(./policy)

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<xsl:for-each select="Root/record"> 
    <xsl:choose> 
    <xsl:when test="not(policy)"> 
     <record_data> 
     <PolicyNumber><xsl:value-of select="PolicyNumber"/></PolicyNumber> 
     <FirdsName><xsl:value-of select="FirdsName"/></FirdsName> 
     <LastName><xsl:value-of select="LastName"/></LastName> 
     <city><xsl:value-of select="city"/></city> 
     <street><xsl:value-of select="street"/></street> 
     </record_data> 
    </xsl:when> 
    <xsl:otherwise> 
    </xsl:otherwise> 
     <record_data> 
     <PolicyNumber><xsl:value-of select="policy/PolicyNumber"/></PolicyNumber> 
     <FirdsName><xsl:value-of select="policy/FirdsName"/></FirdsName> 
     <LastName><xsl:value-of select="policy/LastName"/></LastName> 
     <city><xsl:value-of select="policy/city"/></city> 
     <street><xsl:value-of select="policy/street"/></street> 
     </record_data> 
    </xsl:choose> 
</xsl:for-each> 
+0

此解決方案不起作用。它沒有考慮到源被拆分成兩個單獨的XML文件的事實。 –

相關問題