2008-08-28 79 views
57

在XSLT中包含html實體的最佳方式是什麼?在XSLT中使用HTML實體(例如 )

<xsl:template match="https://stackoverflow.com/a/node"> 
    <xsl:value-of select="."/> 
    <xsl:text>&nbsp;</xsl:text> 
</xsl:template> 

這個方法返回一個XsltParseError

回答

111

您可以使用CDATA節

<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text> 

,或者你可以在本地DTD描述& NBSP:

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]> 

或只使用&#160; i的&nbsp;

5

nstead這一個返回XsltParseError

是的,之所以說是&nbsp;是不是在XML或XSLT預定義的實體,因爲它是在HTML中。

你可以只使用其中&nbsp;代表的Unicode字符:&#160;

14

另外一個可能性,XSLT中使用HTML實體從如下之一:

<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text> 
+1

Unicode字符&#160給出問號和框,輸出未轉義的html實體爲我工作,謝謝。 – AUSteve 2011-08-16 02:23:35

6

XSLT只處理五個基本實體默認情況下:lt,gt,apos,quotamp。其他所有需要定義爲@Aku提及。

5

既然有Unicode,那麼使用命名字符實體通常會適得其反。我建議使用Unicode字符作爲非破壞性空間而不是實體,只是出於這個原因。或者,您可以使用實體&#160;而不是命名實體。使用命名實體使您的XML依賴於內聯或外部DTD。文本標記之間

-3

一個空格字符就足夠了。

22

也可以擴大從aku's answer第二部分的方法,並得到所有的已知字符引用可用的,就像這樣:

<!DOCTYPE stylesheet [ 
    <!ENTITY % w3centities-f PUBLIC "-//W3C//ENTITIES Combined Set//EN//XML" 
     "http://www.w3.org/2003/entities/2007/w3centities-f.ent"> 
    %w3centities-f; 
]> 
... 
<xsl:text>&nbsp;&minus;30&deg;</xsl:text> 

有一個在結果一定差異相比,<xsl:text disable-output-escaping="yes">方法。後者將爲各種輸出產生類似&nbsp;的字符串文字,即使對於<xsl:output method="text">,這也可能與您所希望的不同......相反,通過<!DOCTYPE ... <!ENTITY ...獲取爲XSLT模板定義的實體將始終產生與您的xsl:output設置一致的輸出。

然後,使用本地實體解析器來阻止XSLT引擎從Internet獲取字符實體定義可能是明智的。 JAXP或顯式Xalan-J用戶可能需要Xalan-J的補丁才能正確使用解析器。請參閱我的博客XSLT, entities, Java, Xalan...以獲取補丁下載和評論。

+0

+1,感謝此 – reevesy 2012-08-28 16:22:59

+1

這是美麗的,希望它更爲人所熟知 – IcedDante 2016-05-26 22:46:02

1

我發現所有這些解決方案所產生的空白空間中的一個字符。

使用<xsl:text> </xsl:text>解決了我的問題;但<xsl:text>#x20;</xsl:text>也可能工作。

0

有必要使用實體#x160;

0

我沒有運氣從阿庫的DOCTYPE方法。

什麼MSXML爲我工作的一個轉換的Windows 2003服務器上,是

<xsl:text disable-output-escaping="yes">&amp;#160;</xsl:text> 

排序以上的雜交體。感謝Stackoverflow貢獻者!