2017-02-17 64 views
0

嗨,我有一個從ant xslt task採取參數的樣式表。但參數是完全轉義序列,如<tag-name>等等 這裏是參數的$fileset-xml生表示:link與這直接輸出:XSLT採用轉義序列作爲參數

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://saxon.sf.net/" version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:param name="fileset-xml"/> 
    <!-- --> 
    <!-- --> 
    <xsl:template match="/theRoot"> 
     <root> 
      <xsl:value-of select="$fileset-xml"/> 
     </root> 
    </xsl:template> 
    <!-- --> 
    <!-- --> 
</xsl:stylesheet> 

我的目的是產生一個輸出xml格式,超出該參數,但函數saxon:parse($fileset-xml)不喜歡此格式的參數。我猜如果我們用他們的渲染值替換轉義字符,我會得到一個有效的xml文件,但怎麼做呢?

該處理器是saxonb9-1-0-8j

EDITION_1

作爲apendx到@MartinHonnen的註釋:

處理器:

<classpath location="../../infrastructure/SaxonEE9-7-0-11J/saxon9ee.jar:/net.sf.saxon.TransformerFactoryImpl"/>

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:param name="fileset-xml"/> 
    <xsl:variable name="file-set-xml" select="parse-xml(parse-xml-fragment('&lt;a/&gt;'))"/> 
    <!-- --> 
    <!-- --> 
    <xsl:template match="/theRoot"> 
     <root> 
      <xsl:copy-of select="$file-set-xml"/> 
     </root> 
    </xsl:template> 
    <!-- --> 
    <!-- --> 
</xsl:stylesheet> 

和錯誤:

[xslt] : Fatal Error! Error checking type of the expression 'funcall(parse- xml-fragment, [literal-expr(<a/>)])'. Cause: Error checking type of the expressi on 'funcall(parse-xml-fragment, [literal-expr(<a/>)])'.

+0

那麼,你使用'saxon:parse($ fileset-xml)'獲得哪個錯誤信息? –

+0

該錯誤消息不是來自撒克遜。前面的問題報告了一個非常類似的錯誤消息:http://stackoverflow.com/questions/15812382/getting-compile-error-while-using-format-date-method-in-xslt它出現了問題是用戶實際上正在運行Xalan。 –

回答

1

如果你在表單中提供一個字符串&lt;a/&gt;(10個字符),那麼XPath函數parse-xml-fragment()將會把它變成字符串<a/>(4個字符) ,如果將parse-xml()(或parse-xml-fragment())應用於此4個字符的字符串,則會得到包含名爲「a」的空元素的節點樹。

所以你需要解析數據兩次。

+0

你能舉個例子嗎? – Hairi

+0

Kau 你的意思是適用於一個參數?因爲當我將它作爲參數應用時,我得到一個錯誤。 – Hairi

+0

@Hairi,你可以切換到Saxon 9.7和'version =「3.0」'嗎?然後執行'parse-xml(parse-xml-fragment($ fileset-xml))'應該可以。我不記得撒克遜B 9.1是否有擴展函數來解析一個分段字符串,並且你需要它來進行第一個解析步驟) –