2013-11-03 68 views
1

我一直在努力爭取一個xsl文件來處理兩個(或更多)XML文件。如何在一個xsl文檔中使用兩個(或更多)xml文件?

我按照這篇文章中的步驟:Including an XML file in an XML/XSL file但我一直沒能得到這個工作。

我似乎無法得到加載的文件進行處理,沒有錯誤。

這是第一個XM文件 - Dial_Stats_MWB:

<?xml version="1.0" encoding="utf-8"?> 
<UK_Products_Pipeline> 
    <LastFinishCode> 
    <SiteName>UK</SiteName> 
    <LastFinishCode>Agent Logout</LastFinishCode> 
    <Numbers>1</Numbers> 
    </LastFinishCode> 
    <LastFinishCode> 
    <SiteName>UK</SiteName> 
    <LastFinishCode>Busy</LastFinishCode> 
    <Numbers>1</Numbers> 
    </LastFinishCode> 
    <LastFinishCode> 
    <SiteName>UK</SiteName> 
    <LastFinishCode>BW Sale</LastFinishCode> 
    <Numbers>1</Numbers> 
    </LastFinishCode> 
</UK_Products_Pipeline> 

第二個文件 - Dial_Stats_UK:

<?xml version="1.0" encoding="utf-8"?> 
<UK_Products_Pipeline> 
    <LastFinishCode> 
    <SiteName>MWB</SiteName> 
    <LastFinishCode>Bearer Capability Not Presently Authorized (ISDN Cause Code 57)</LastFinishCode> 
    <Numbers>1</Numbers> 
    </LastFinishCode> 
    <LastFinishCode> 
    <SiteName>MWB</SiteName> 
    <LastFinishCode>Confirmed Booking</LastFinishCode> 
    <Numbers>1</Numbers> 
    </LastFinishCode> 
    <LastFinishCode> 
    <SiteName>MWB</SiteName> 
    <LastFinishCode>Lost</LastFinishCode> 
    <Numbers>1</Numbers> 
    </LastFinishCode> 
</UK_Products_Pipeline> 

而且XSL文件:

<?xml version="1.0" encoding='utf-8'?> 
<xsl:stylesheet xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html"/> 
    <xsl:template match="/"> 
    <html> 
     <head> 
     <title> XSLT with XML included </title> 
     </head> 
     <body style="background-color:lightblue;color:green"> 
     <table cellSpacing="0" border="1" cellPadding="2"> 
      <!-- Set Variables --> 
      <xsl:variable name="external"> 
      <xsl:copy-of select="document('D:\DATA\Marquee\dial_stats_UK.xml')/*"/> 
      </xsl:variable> 
      <!-- Process Data Start --> 
      <xsl:for-each select="//UK_Products_Pipeline/LastFinishCode"> 
      <tr> 
      <xsl:if test="SiteName ='MWB'"> 
       <td> 
        <xsl:value-of select="SiteName"/> 
      </td> 
       <td> 
        <xsl:value-of select="LastFinishCode"/> 
       </td> 
       <td> 
        <xsl:value-of select="Numbers"/> 
       </td> 
       </xsl:if> 
      </tr> 
      </xsl:for-each> 
      <!-- Process File Data Start --> 
      <xsl:call-template name="ExternalData"> 
      <xsl:with-param name="data" select="$external"/> 
      </xsl:call-template> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 
    <xsl:template name="ExternalData"> 
    <xsl:param name="data"/> 
    <xsl:variable name="external"> 
     <xsl:copy-of select="document('D:\DATA\Marquee\dial_stats_UK.xml')/*"/> 
    </xsl:variable> 
    <table cellSpacing="0" border="1" cellPadding="2" style="background-color:white;color:black"> 
     <tr> 
      <td> 
      I do see this. 
      </td> 
     </tr> 
     <!-- Process External Data --> 
     <xsl:for-each select="//UK_Products_Pipeline/LastFinishCode"> 
      <tr> 
      <td> 
       <xsl:value-of select="SiteName"/> 
      </td> 
      </tr> 
      <tr> 
      <xsl:if test="SiteName ='UK'"> 
      <td> 
       <xsl:value-of select="SiteName"/> 
      </td> 
      <td> 
       <xsl:value-of select="LastFinishCode"/> 
      </td> 
      <td> 
       <xsl:value-of select="Numbers"/> 
      </td> 
      </xsl:if> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </xsl:template> 
</xsl:stylesheet> 

當處理髮生再次處理相同的文件而不是第二個文件。

我不知道你是否可以給我任何關於我在這裏做錯了什麼的建議?

回答

2

變化

`<xsl:for-each select="//UK_Products_Pipeline/LastFinishCode">` 

`<xsl:for-each select="document('file:///D:/DATA/Marquee/dial_stats_UK.xml')/UK_Products_Pipeline/LastFinishCode">` 
在要處理來自第二輸入文件數據模板

雖然更簡潔的方法是從第二個要處理的文件中爲節點編寫匹配模板。 然後你只是會做:

`<xsl:apply-templates select="document('file:///D:/DATA/Marquee/dial_stats_UK.xml')/UK_Products_Pipeline" mode="my-mode"/>` 

和你的模板,該模式將輸出你想要的表。

+0

這確實解決了這個問題的確,我想我的錯誤在於,你必須直接解決文件中的每個位置,而不是一旦它被加載使用相對尋址。 非常感謝您的建議! – NiteOwls

+0

您可以使用apply-templates或for-each來確保上下文節點來自輔助輸入文件,然後您可以使用相對路徑。然而,執行呼叫模板不會更改上下文節點。 –

1

請注意,document()與XML系列中的許多其他內容一樣,適用於URI,而不適用於Windows文件名。規範的某些實現允許您使用Windows文件名來代替URI,但許多不這樣做,所以最好不要依賴它。例如

d:\data\marquee\stats.xml 

是一個Windows文件名,而不是URI。相應的URI是

file:///d:/data/marquee/stats.xml 
+0

非常感謝您的解釋。我需要使用共享目錄來拉文件,是否會這樣: 'file:/// servername/sharename/stats.xml' 或者其他不同的東西? – NiteOwls

+0

如果您使用的是UNC文件名,則它們映射到URI是黑色藝術。在以前的Saxon版本中,有一些關於UNC文件名和URI的(經驗性)信息:http://sourceforge.net/apps/mediawiki/saxon/index.php?title=UNC_filenames,但它可能不適用於當前版本或其他XSLT處理器。我想我的建議是通過HTTP訪問文件,而不是通過UNC。 –

+0

謝謝,但不幸的是我不能控制這個來自於'SQL'服務器,並且他們沒有辦法允許我在那裏安裝http或事件來'添加'將文件寫入的目錄作爲虛擬目錄到遠程http服務器。我有一雙手綁在這裏。 – NiteOwls

相關問題