【问题标题】:XSLT parsing a string with both escaped and non escaped characters (< and &lt;)XSLT 解析带有转义字符和非转义字符(< 和 <)的字符串
【发布时间】:2013-02-21 21:29:26
【问题描述】:

在 XSLT 1.0 中,处理这个 xml 元素的最佳方式是什么

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

请注意,“小于号”表示了两次。即'&amp;lt;' and '&lt;'.

要转义 &amp;lt; 字符,我可以这样做

<?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> 
  • 如果我将禁用输出转义设置为“是”,&amp;lt; 字符会正确显示,但"&amp;lt;" 会完全删除。
  • 如果我将禁用输出转义设置为“否”,&amp;lt; 字符会导致解析异常。

我可以做些什么来允许两者?

【问题讨论】:

  • 只有魔法,而不是黑色而不是白色。请仅使用格式正确的 XML。
  • @kan 的意思是,&amp;lt; 不是 XML 中的有效文本内容。
  • XML 无效(甚至格式正确)。 XML 要求在解析字符数据中将&amp;lt; 转义为&amp;lt;(或&lt;![CDATA[&lt;]]&gt;&amp;#x3C; 或诸如此类)。 (与一些 SGML 应用程序不同,XML 没有任何具有纯字符数据内容的元素的概念。)
  • 你希望你的输出是什么样子的。定义 input1 => output1 和 input2 => output2
  • 它不是一个 XML 元素,所以你不能用 XSLT 处理它。

标签: java html xml xslt xslt-1.0


【解决方案1】:

总的来说,我认为在 XSLT 1.0 中处理您的输入的最佳方式是使用其他工具将您的输入转换为 XML,然后正常处理它。 XSLT 处理器在面对非 XML 输入时的行为往往是不稳定的。

【讨论】:

    【解决方案2】:

    简单的答案(正如其他人所暗示但没有直接说的!)是输入不是 XML。 XSLT 根本无法处理该输入 - 您将需要对其进行预处理或修复生成它的任何系统,以便它生成实际的 XML,而不仅仅是 看起来像 XML的东西!

    【讨论】:

      【解决方案3】:

      我认为第一种方法 (disable-output-escaping="yes") 是唯一的方法。否则你会得到一个错误,这是不可能的。

      您必须弄清楚如何防止(或修补)实体解析(&amp;lt; 已解析和替换)。

      【讨论】:

      • 大概是因为建议的解决方案不起作用。 disable-output-escaping 不会神奇地让您解析格式错误的 XML。
      • @MichaelKay 感谢您的回复,但存在误解。建议的解决方案是修补实体解析,同时使用disable-output-escaping="yes" 指令。我知道 OP 应该以某种方式整理 XML,因为这是格式错误的 XML,但如果这不可能,他可以使用此解决方法修复 XML。
      • 好吧,我不认为有任何方法可以在 XML 解析器中“修补实体解析”以允许它在元素的字符内容中接受未转义的 &lt;
      • @MichaelKay 这取决于实现,大约 10 年前我用 Xalan/Xerces 做到了,所以这是可能的。我不确定当前的实现,但我认为应该是可能的。
      猜你喜欢
      • 2015-10-16
      • 2016-04-15
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多