如何防止 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"><!DOCTYPE html>
</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
或类似。
我正在使用 XSLT 从 XML 个来源生成 HTML。 HTML 显示了很多原始 XML 文件中没有的白色 space。通常这不是问题,因为浏览器会忽略多余的白色 space 字符。但我正在开发一个应用程序,该应用程序依赖于文本光标在 HTML 页面内的正确定位。添加的 whitespaces 确实弄乱了偏移量,使得无法可靠地将光标定位在元素内。
我的问题:如何让我的 XSLT 不在文本节点中引入任何额外的白色space?我正在使用
[编辑]
我创建了一个简单示例来展示同样的奇怪行为。首先是 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"><!DOCTYPE html>
</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
或类似。