2010-12-13 68 views
0

我處理以下的(例如)XML:XSL short`value-of` with`disable-output-escaping`?

<?xml version="1.0"?> 
<root>&amp; &amp; &amp;</root> 

通過以下(實施例)XSL:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0"> 
    <xsl:output 
    method="html" 
    version="4.0" 
    encoding="UTF-8" 
    omit-xml-declaration="yes" 
    /> 
    <xsl:template match="/"> 
    <input value="{/root}" /> 
    </xsl:template> 
</xsl:stylesheet> 

使用Python和lxmllibxslt-1.1.17),並且我發現了以下輸出:

<input value="&amp;amp; &amp;amp; &amp;amp;" /> 

據我所知,我可以解決這個與以下模板:

<xsl:template match="/"> 
    <input> 
     <xsl:attribute name="value"> 
     <xsl:value-of 
      select="/root" 
      disable-output-escaping="yes" 
      /> 
     </xsl:attribute> 
    </input> 
    </xsl:template> 

但這是一個很多的打字。在PHP中使用XSL之後,我不記得使用這種方法來使用簡寫形式value-of來取消引用XML實體。有沒有一個簡短的解決方法,所以我們不必繼續輸入以上所有內容?

+1

我無法重現您的問題。你確定你的發佈示例輸入和樣式表是完整的並且實際證明了問題(至少樣式表缺少'xsl'命名空間聲明)?會議記錄可在這裏找到:http://pastebin.com/rbMhBXRm – 2010-12-13 13:26:31

+0

你的輸入源有三個&&amp;符號字符,它們碰巧被編碼爲字符實體(它應該是)。沒有辦法將它輸出爲像'& amp'這樣的「HTML編碼」,除非它們不是像第一個字符實體那樣的字符實體,而是像在CDATA部分中那樣的五個字符'&'。 – 2010-12-13 14:29:09

回答

1

事實上DOE 設計爲這種情況下。對不起,如果你知道,只是爲了連續。

http://www.w3.org/TR/xslt#disable-output-escaping

通常,xml輸出方法輸出文本節點時逸出&和<(以及可能的其它字符)。這確保了輸出是格式良好的XML。但是,有時可以方便地生成幾乎沒有格式良好的XML輸出;例如,輸出可能包括意圖通過隨後的非XML感知過程轉換爲格式良好的XML的不合格部分。出於這個原因,XSLT提供了一種禁用輸出轉義的機制。一個xsl:value-of的或XSL:文本元素可以禁用輸出轉義屬性...

我想真正的痛苦是,你不能使用DOE在atrribute價值的表達,例如{disable-output-escaping(root)}

所以,我想不出有什麼辦法可以縮短這個。

+0

更接近這個問題。你能重現這個問題嗎?我認爲你不能。 – 2010-12-13 14:00:40

+0

@Alejandro。哎呀。我主要回答了「這是否有一個簡短的解決方案,所以我們不必繼續輸入以上所有內容?」部分。你可以downvote。 – Flack 2010-12-13 14:07:16