【发布时间】:2021-08-22 09:21:36
【问题描述】:
我需要在技术测试平台中运行由 XSLT 生成的输出文件 (XHTML)。
每次我使用长文本字符串(来自源文件)并执行 XSLT 时,测试台都不会批准该文档。原因似乎是输出文件 (XHTML) 正在使用长文本字符串并将其分成几行。
在“xsl:output”中我设置了属性“suppress-indentation”,但看起来该属性只控制节点元素(标签)的缩进,而不是节点值的长度。
在我的环境中,我还控制了终端中的输出文件,以确保问题不仅限于我的编程文本编辑器。
有没有办法控制 XSLT 何时判断将长字符串切割成几行的长度?
我的环境:
-
来自 Saxonica 的 Saxon-HE 10.5J
-
Java 版本 11.0.11
您可以在 xsltfiddle 中看到该行为: https://xsltfiddle.liberty-development.net/jxWZS72/4
数据:
<?xml version="1.0" encoding="utf-8" ?>
<data>
<content-cut>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</content-cut>
<content-no-cut>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt</content-no-cut>
</data>
XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
>
<xsl:output method="xhtml" indent="yes" suppress-indentation="content" html-version="5"/>
<xsl:template match="data">
<html>
<head>
<title>MyTitle</title>
</head>
<body>
<string-one>
<xsl:value-of select="content-cut"/>
</string-one>
<string-two>
<xsl:value-of select="content-no-cut"/>
</string-two>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
结果:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>MyTitle</title></head>
<body>
<string-one>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt
ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat.
</string-one>
<string-two>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt</string-two>
</body>
</html>
想要的结果:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>MyTitle</title></head>
<body>
<string-one>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </string-one>
<string-two>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt</string-two>
</body>
</html>
【问题讨论】:
-
众所周知,如果您使用缩进,Saxon 会在段落中插入换行符以提高可读性,我认为商业版本具有专有的输出属性,理论上可以通过将非常高的行长度设置为默认值来实现这一点。我不记得HE是否有简单的解决方案;一方面依赖缩进,另一方面又希望保留某些格式是一种困难的方法。
-
saxonica.com/html/documentation10/extensions/output-extras/… 具有
saxon:line-length的默认值80和“使用 HTML 输出方法,文本行会尽可能按此行长度拆分。”。 -
规范 w3.org/TR/xslt-xquery-serialization-31/#HTML_INDENT 建议,例如,对于
pre元素,不应在内容内添加空格,我认为 Saxon 可能会尊重这一点,因为string-one或string-two是无论如何都不是任何 HTML 元素,请改用pre。我认为从技术上讲,suppress-indentation="string-one string-two"也应该有效,但让我们看看 Michael Kay 怎么说。