2013-03-06 59 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!