如何防止 XSLT 在 HTML 输出中引入空格

How to keep XSLT from introducing whitespaces in HTML output

我正在使用 XSLT 从 XML 个来源生成 HTML。 HTML 显示了很多原始 XML 文件中没有的白色 space。通常这不是问题,因为浏览器会忽略多余的白色 space 字符。但我正在开发一个应用程序,该应用程序依赖于文本光标在 HTML 页面内的正确定位。添加的 whitespaces 确实弄乱了偏移量,使得无法可靠地将光标定位在元素内。

我的问题:如何让我的 XSLT 不在文本节点中引入任何额外的白色space?我正在使用 但这并不能阻止处理器引入大量白色space。看起来 HTML 应用了一些漂亮的打印处理,我不知道这是从哪里来的。我目前使用的是 Saxon PE 9.9.1.7

[编辑]

我创建了一个简单示例来展示同样的奇怪行为。首先是 XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <p>This is a long sentence. Trying to reproduce a whitespace handling problem with XSLT. This manual describes the spacecraft, safety aspects, usage and maintenance procedures. Make sure the manual is available to anyone who will be using the product.</p>
</root>

这是简化的 XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="1.0">

    <xsl:output method="html" encoding="UTF-8"/>

    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="root">
        <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;&#xD;</xsl:text>
        <html>
            <head>
                <title>Test</title>
            </head>
            <body>
                <xsl:apply-templates select="*"/>
                <script src="cursor.js"></script>
            </body>
        </html>
    </xsl:template> 

    <xsl:template match="p">
        <p contenteditable="true" id="p1" onclick="show_position()">
            <xsl:value-of select="."/>
        </p>
    </xsl:template>

</xsl:stylesheet>

JavaScript文件显示当前光标位置:

function show_position( )
{
    alert('position: ' + document.getSelection().anchorOffset );
}

XSLT 生成的 HTML 看起来像这样(在 oXygen 中显示):

<!DOCTYPE html>
<html>
   <head>
       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
       <title>Test</title>
   </head>
   <body>
      <p contenteditable="true" id="p1" onclick="show_position()">This is a long sentence. Trying to reproduce a whitespace handling problem with XSLT.
         This manual describes the spacecraft, safety aspects, usage and maintenance procedures.
         Make sure the manual is available to anyone who will be using the product.</p><script src="cursor.js"></script></body>
</html>

如预期的那样,在浏览器中查看 HTML 会使所有多余的白色 space 折叠成一个 space。在段落内部单击会显示距段落开头的当前偏移量。在 'This manual' 之前单击显示位置 86。单击右侧一个字符显示位置 96。以 'Make sure'.

开头的句子中引入了相同的额外白色 space

我尝试使用 Chrome 和 Safari - 两者显示相同的结果。这似乎不是浏览器问题,而是 XSLT 处理器生成 HTML 的问题。我尝试过其他撒克逊版本,但结果 HTML 始终相同。

任何关于如何在我的 HTML 输出中防止这些额外的白色 space 字符的进一步信息将不胜感激。

我认为 output method="html" 的默认值是 indent="yes",因此您当然可以在 xsl:output 声明中显式设置 indent="no"

此外,正如您所说您使用的是 Saxon PE 9.9,您可以访问 XSLT 3 功能,例如 suppress-indentation="p" and/or Saxon PE/EE 特定设置以使用非常高的设置正常的行长度,检查文档,例如saxon:line-length 或类似。