2012-03-08 80 views
1

我正在將XHTML文件轉換爲XML。我遇到的問題是XHML實體引用的所有內容都被吞噬了,例如&拷貝;正在消失在輸出中。被XSLT吞噬的XHML實體引用

我的代碼如下:

<?xml version="1.0" encoding="utf-8"?> 

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

    <xsl:template match="h1|h2|h3|h4|h5|h6|h7|h8|h9"> 
    <heading> 
     <xsl:attribute name="name"> 
     <xsl:value-of select="name(.)" /> 
     </xsl:attribute> 
     <xsl:attribute name="content"> 
     <xsl:value-of select="." /> 
     </xsl:attribute> 

    </heading> 
    </xsl:template> 

    <xsl:template match="/html/body"> 
     <mapping> 
     <xsl:apply-templates select="h1|h2|h3|h4|h5|h6|h7|h8|h9" />   
     </mapping> 
    </xsl:template> 
</xsl:stylesheet> 

在輸出的任何實體引用消失。我試着將實體定義添加到我的XSL中...沒有運氣。

有什麼建議嗎?

Anton

+1

您能否提供您的輸入樣本和您想要的輸出? – GeoGriffin 2012-03-08 17:14:45

+1

另外,您能否詳細說明您使用哪個處理器以及如何添加實體定義? – BiAiB 2012-03-08 17:16:44

+0

這是我後來問過的一個類似問題。 http://stackoverflow.com/questions/5985615/preserving-entity-references-when-transforming-xml-with-xslt – 2012-03-08 17:18:32

回答

2

實體引用需要DTD。確保源文檔包含DTD,並且不要禁用實體解析。

你想要發生的是&copy;在輸入文件中變爲©。您不希望輸出文檔中的實體引用。

+0

實體引用實際上不需要DTD,只需要聲明它們。 – 2012-03-08 23:19:44

+0

乾杯隊友,這是訣竅。不幸的是,當將DOCTYPE定義添加到源xhtml文件時,我仍然遇到問題,因爲xslt處理器(altovaxml)無法解析到DTD的外部鏈接。我已經能夠在本地下載DTD和實體文件並參考本地副本。 – anthun 2012-03-09 08:04:09

+0

這是故意的。 w3c確保這些DTD鏈接不適用於來自XML處理器的請求,因爲它們受到抨擊。大多數XML處理器都有一個稱爲XML目錄的工具來自動引用DTD的本地副本,而無需更改系統標識符。 – 2012-03-09 08:50:30

1

在XSLT啓動之前,實體都由XML解析器(概念上)擴展,但XSLt並不知道使用了實體引用,所以無法保留它們。如果你不希望非ASCII字符顯示爲字符,那麼最簡單的解決方法是指定任何非ASCII字符將被編碼爲十進制或十六進制數字的引用使版權的編碼如

<xsl:output encoding="US-ASCII"/> 

然後會出現爲&#169;而不是©(假設您的輸出實際上是由XSLT序列化的)。