我在XSLT处理器的行为上遇到了一些特殊的差异。我想知道这背后的原因是什么,以及处理器差异是否有完整的概述 我测试了以下简单转换(使用虚拟输入):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:text>1=
2=
3=
4=

end</xsl:text>
</xsl:template>
</xsl:stylesheet>
在XML Spy(v 2011 sp1 x64)中运行,输出为:
1=
2=
3=
4=
end
在所有情况下,在=
之后的十六进制中,在4=
之后的行上,添加了两个字符0D
和0A
。
显然,XML Spy将&xA;
或&xD;
的每个请求替换为完整的CR + LF事件,除非按顺序请求CR和LF,然后彼此相继(请参阅3 =部分)。
但是当在saxon9he中运行时,我得到一个警告,我正在运行带有v2.0处理器的v1.0样式表,输出是
1=
2=3=
4=
end
在这种情况下,&xA;
的所有请求都被0D 0A
替换(因此在LF前面添加了CR),但是&xD;
的请求输出了请求的CR,不是额外的LF。
重新运行XML Spy将XSLT版本设置为2.0会产生与1.0相同的结果,所以我想这两个XSLT版本中的不同之处就是导致这种情况。
最有可能的是,这只是我们必须了解的工具之间的差异,但我想知道是否还有更多的话要说。
答案 0 :(得分:5)
2.0规范规定,对于输出方法文本,它是实现定义的,如何表示行结尾(更具体地说,“数据模型实例中的换行符可以使用常规使用的任何字符序列输出表示在所选系统环境中结束的行。“)。
XSLT 1.0什么都没说(实际上并没有什么不同)。
某些实现可能会一致地使用单个换行符,有些可能会完全按照您的要求输出,有些可能会使用您正在运行的操作系统的默认行结尾。