【问题标题】:XSLT transformation of ISO-8859-1ISO-8859-1 的 XSLT 转换
【发布时间】:2015-12-07 03:33:31
【问题描述】:

我们可以用 ISO-8859-1 unicode 代替 UTF-8 进行 XSLT 转换吗?

目前,我在使用 UTF-8 时没有遇到任何问题。 下面的代码工作正常:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:this="http://this.com"
xmlns:wd="urn:com.workday.report/abcd_services" version="2.0">

    <xsl:output method="text" indent="yes" encoding="UTF-8"/>  

虽然下面的代码给出了错误:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:this="http://this.com"
xmlns:wd="urn:com.workday.report/INT1204_GE_Capital_Fleet_Services" version="2.0">

    <xsl:output method="text" indent="yes" encoding="ISO-8859-1"/>    

【问题讨论】:

  • 您使用的是哪个 XSLT 处理器,确切的错误消息是什么?
  • 错误是什么?您使用的是哪个 XSLT 引擎?您可能没有正确处理“文本”方法
  • 只是为了检查:如果将“text”更改为“html”,输出是什么?有时对 html 的支持会更好,它可以帮助查明原因

标签: xml xslt unicode utf-8 iso-8859-1


【解决方案1】:

我所知道的每个处理器都支持 ISO-8859-1、US-ASCII(强制)、CP1252 以及它们的许多变体,因为从处理器的角度来看,这些只是单字节编码,除了转换表之外,实现起来很简单。

这给我们留下了错误,很遗憾,您没有显示。所以让我们来看看几个选项:

<?xml version="1.0" encoding="ISO-8859-1"?>

你把它写成你的样式表的序言。虽然它本身并不违法,但它没有任何作用,并且不会对处理器处理任何输入 XML 或输出的方式产生任何影响。但是,它确实严格限制了您可以使用的字符。

假设您将原始样式表保存为 UTF-8,然后使用 BOM,使用一些不支持 XML 的编辑器将其更改为 ISO-8859-1,这将是非法的,您将收到如下内容:“F [Xerces] 不允许匹配“[xX][mM][lL]”的处理指令目标。”,或“prolog 前不允许的内容”

作为一般规则,只需将样式表保留为您的任务可用的最佳编码,通常是 UTF-8,因为任何使用 XML 的工具都必须能够处理它,而且由于这是一个样式表,任何XSLT 处理器将能够处理它。

<xsl:output method="text" indent="yes" encoding="ISO-8859-1"/> 

这是您在样式表本身中编写的。如果将方法设置为 XML 或 HTML,它永远不会(几乎不会)导致错误,因为您的样式表中的任何字符都将被转义为数字实体:假设您有“ٺٻټٽ”,它将变为 &amp;#x067A;&amp;#x067B;&amp;#x067C;&amp;#x067D; (或十进制等值),因为这些字符在 ISO-8859-1 中不可用。

但是您将方法设置为text。这本身没有问题,但是该编码可用的字符受到严重限制。假设您当前的 ISO-8859-1 样式表已正确编码(即样式表已编译),但您有如下内容:

<!-- not allowed with your text output -->
<xsl:value-of select="'&#x100;&#x101;" />

相当于这个:

<!-- won't compile -->
<xsl:value-of select="'Āā'" />

现在在第一种情况下,这将引发错误。例如,我自己的处理器Exselt 会抛出:

序列化异常:在不允许字符引用的上下文中,字符“Ā”不能用所用的编码表示。

Saxon 会抛出:

此编码中不可用的输出字符(十进制 256)

我的猜测是上述情况之一适用于您。如果您明确想要使用较少的编码,请确保您没有做任何非法的事情。如果这没有帮助,请使用确切的错误、使用的处理器以及如何重现它来更新您的问题(我建议您无论如何都应该这样做)。

【讨论】:

  • 哇,这个家伙甚至懒得告诉我们他遇到了什么错误,如此详细的回应!
  • @MichaelKay,是的,我被冲昏了头脑,也许我需要在今天的 xslwg 会议之后做些微不足道的事情:P。
猜你喜欢
  • 2016-02-19
  • 2013-01-23
  • 2013-07-03
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2016-07-18
相关资源
最近更新 更多