2013-03-06 63 views
2

在XSLT 1.0,什麼是處理此xml元素XSLT解析字符串與兩個轉義和非轉義字符(<和<)

<Product>This is a product. &lt; and its price is < 10</Product> 

注意,「小於符號」表示的最佳方式兩次。即作爲'&lt;' and '<'.

逃脫<角色,我能做到這一點

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" method="html" indent="yes" /> 
<xsl:template match="/"> 
    <html> 
    <body> 
    <table border="1"> 
     <tr> 
     <th>Product</th> 
     </tr> 
     <tr> 
     <td><xsl:value-of select="Product" disable-output-escaping="yes" /></td> 
     </tr> 
    </table> 
    </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 
  • 如果設置了禁用輸出轉義爲「是」,<字符顯示正確,但"&lt;"被完全去掉了。
  • 如果我將disable-output-escaping設置爲「no」,<字符會導致解析異常。

我該怎麼做才能讓兩者兼容?

+6

只有魔法,而不是白色。請只使用格式正確的XML。 – kan 2013-03-06 21:34:27

+3

@kan在說什麼,是<?>不是XML中的有效文本內容。 – 2013-03-06 21:35:21

+2

該XML無效(或者甚至是格式良好)。 XML *要求*在被解析的字符數據中以'<'(或者''或者'<'或者其他)的形式轉義。 (與某些SGML應用程序不同,XML沒有任何純字符數據內容元素的概念。) – ruakh 2013-03-06 21:35:47

回答

-1

我認爲第一種方法(disable-output-escaping="yes")是唯一的方法。否則,你會得到一個錯誤,這是不可能的。

您必須弄清楚如何防止(或修補)實體解析(&lt;已解決並替換)。

+0

downvote的原因是什麼? – gaborsch 2013-03-07 11:15:47

+1

大概是因爲建議的解決方案不起作用。禁用輸出轉義不會奇蹟般地使您能夠解析格式不正確的XML。 – 2017-03-11 18:46:06

+0

@MichaelKay謝謝你的迴應,但有一個誤解。建議的解決方案是在使用'disable-output-escaping =「yes」'指令的同時修補實體解析。我知道OP應該以某種方式整理XML,因爲這是一種格式不正確的XML,但如果這不可行,他可以使用此解決方法修復XML。 – gaborsch 2017-03-13 14:28:04

3

總體而言,我認爲在XSLT 1.0中處理輸入的最佳方式是使用其他工具將輸入轉換爲XML,然後正常處理它。遇到非XML輸入時,XSLT處理器的行爲往往不穩定。

1

簡單的答案(正如其他人所暗示的,但不是直接說的)是輸入不是XML。 XSLT根本無法在該輸入上工作 - 您需要預處理它,或者獲取修復它的任何系統,以便生成實際的XML,而不僅僅是看起來像 XML!