2011-10-18 42 views
1

我有一個標籤如何強制XSLT因爲它可以在輸入XML報價

<name>Sample " '</name> 

在XSL我改變這個標籤編碼撇號:

<xsl:variable name="productName" select="substring($elemXPath/name,1,50)"/> 
<someTag someAttr="{$productName}"/> 

當我運行XSLT輸出是:

<someTag someAttr="Sample &quot; '"/> 

,但我想獲得

<someTag someAttr="Sample &quot; &apos;"/> 

改爲。我不想用單獨的轉義模板來包裝每個輸入數據的使用,因爲在我的xslt中有這麼多的地方。

我試着輸入文件編碼撇號,但是,當我把

<name>Sample &apos;</name> 

輸入文件,然後我得到了

<someTag someAttr="Sample &amp;apos;"/> 

,而不是

<someTag someAttr="Sample &apos;"/> 

我的問題是如何強制/配置XSLT來編碼撇號,如同引號一樣?

回答

2

在XSLT 1.0中沒有辦法將序列化控制到這個級別。

在XSLT 2.0使用<xsl:character-map>如下面的例子

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       version="2.0"> 
<xsl:output method="xml" use-character-maps="myChars" omit-xml-declaration="yes"/> 

<xsl:character-map name="myChars"> 
    <xsl:output-character character="&quot;" string="&amp;quot;"/> 
    <xsl:output-character character="&apos;" string="&amp;apos;"/> 
</xsl:character-map> 

<xsl:template match="/"> 
    <someTag someAttr="Sample &quot; &apos;" /> 
</xsl:template> 
</xsl:stylesheet> 

這將產生所需的結果

<someTag someAttr="Sample &quot; &apos;"/> 
+0

[此相關文章](http://stackoverflow.com/a/1103319/1594157)爲XSLT 1.0提供瞭解決方案。 – sufw

+0

@ sufw,'&'當兩個字符串被視爲解析的字符內容時肯定不同於'''。第一個字符串的長度爲5,而第二個字符串的長度爲1。 –

1

一般情況下,你不應該關心這兩個XSLT處理器選擇的數據的等效序列化。任何理智的消費者都會以同樣的方式對待他們;如果不是,你應該修復消費者。

但是,出於實用的原因,XSLT 1.0提供了禁用輸出轉義,而XSLT 2.0提供了字符映射,所以如果您真的需要,您可以在此級別調整輸出。

相關問題