2011-04-19 31 views
0

我一直在處理XSLT 2.0在過去的一天,試圖解析一個純文本文件。 顯然我甚至無法到達實際獲得它的部分,此時,xsl不必做任何事情,只需在saxonb-xslt處理器中正確加載即可。XSLT 2.0奇怪的錯誤[SXXP0003]

XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/02/xpath-functions" version="2.0"> 

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

<xsl:template match='/'> 
<add_adverts> 
<Body> 
<Envelope> 
<Advert> 
<xsl:for-each select="tokenize(unparsed-text('A2.blm'), '\r?\n')"> 
<fff>?</fff> 
</xsl:for-each> 
</Advert> 
</Envelope> 
</Body> 
</add_adverts> 
</xsl:template> 

</xsl:stylesheet> 

我如何運行它:

saxonb-xslt -s:A2.blm -xsl:eraxsl.xsl -o:test.xml 

的BLM文件是一個純文本文件,第一行是:#頭部#最後一行#END#有一個在其中命名爲#DATA#,我想從中解析直到結束。 每個記錄由^分隔。

感謝,

+0

您是否將文本文件作爲輸入源傳遞到了命令行? – 2011-04-19 12:29:53

+0

請考慮提供最少但完整的樣本,以便我們輕鬆地重現問題?那個撒克遜版本就是那個版本? – 2011-04-19 12:30:37

+0

查看我的答案以獲得完整的解決方案。您的問題是無法成功解析相對URI - 該文件必須與XSLT樣式表位於同一目錄中。或者,您需要提供絕對URI。 – 2011-04-19 13:31:48

回答

1

我完全不瑞普這個問題 - 我已經建立在同一個目錄中XSLT樣式表的「A2.blm」文件。轉型如預期般運作。

此錯誤來自XML解析器,而不是來自XSLT處理器。很可能你已經提供了一個源XML文件,它不是一個格式良好的XML文檔(或完全缺失)。

很可能是文件「A2.blm」無法找到或訪問 - 檢查井

要找到此文件的順序,它必須位於樣式表文件所在的目錄中。

XSLT 2.0 W3C spec

「未經解析文本函數讀取外部資源(例如文件),並返回其內容作爲字符串

的$的href參數必須是一個URI形式的字符串,URI必須不包含片段標識符,並且必須標識一個可以作爲文本讀取的資源如果URI是一個相對URI,那麼它將相對於靜態基本URI進行解析上下文。 「

而最重要的是:

注: 如果一個不同的基URI是合適的(例如,當解析的相對URI從源文檔中讀取),則相對URI應使用resolve-來解決uriFO函數,然後將它傳遞給未解析文本函數。「

這是一個證明,你的改造,其餘按預期工作:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/02/xpath-functions" version="2.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match='/'> 
     <add_adverts> 
      <Body> 
       <Envelope> 
        <Advert> 
         <xsl:for-each select="tokenize(., '\r?\n')"> 
          <fff>?</fff> 
         </xsl:for-each> 
        </Advert> 
       </Envelope> 
      </Body> 
     </add_adverts> 
    </xsl:template> 
</xsl:stylesheet> 

當這一轉型是這個XML文檔施加:

<t>1&#xA;2&#xD;&#xA;3&#xA;</t> 

想要的,正確的結果產生

<add_adverts xmlns:fn="http://www.w3.org/2005/02/xpath-functions"> 
    <Body> 
     <Envelope> 
     <Advert> 
      <fff>?</fff> 
      <fff>?</fff> 
      <fff>?</fff> 
      <fff>?</fff> 
     </Advert> 
     </Envelope> 
    </Body> 
</add_adverts> 
+0

再次,驚人的答案。順便說一句,做我的輸入文件(我想要轉換爲XML)必須有標籤(在您的示例 ...),我不能使用XSLT將常規文本文件轉換爲XML? – snoofkin 2011-04-20 13:25:42

+1

你可以使用任何東西 - 我通常使用''。或者您可以在命令行中指定一個初始模板名稱(檢查語法),在這種情況下,您根本不指定源XML文件。 – 2011-04-20 13:40:56

2

saxon-xslt的-s:參數指定源文件,必須採用xml格式,我認爲。在您的示例中,您不需要此源,因爲您在模板中指定了文件名。解決方法是刪除源參數並指定命名模板而不是匹配作爲起點:

<xsl:template name="main"> 
    <add_adverts>...<add_adverts> 
</xsl:template> 


saxonb-xslt -xsl:eraxsl.xsl -o:test.xml -it:main 
+0

+1。謝謝,我也會試試看。 – snoofkin 2011-04-20 13:26:39