PHP中的XSLTProcessor总是删除空白


XSLTProcessor in PHP always removes white space

我正在尝试使用XSLTProcessor来组合一些XML和一个XSLT样式表以组合成一个html文件。然而,它总是导致在一行中输出html。

例如我的XSLT:

<p>
    <strong>my sheet</strong>
    this is <strong>my</strong> <em>style</em>
</p>

变成:

<p><strong>my sheet</strong>this is <strong>my</strong><em>style</em></p>

我正在使用:

<xsl:preserve-space elements="*" />
<xsl:output method="html" version="4.0" encoding="iso-8859-1" indent="yes"/>

但是我想保留我的html。有人知道吗?

preserve-space用于处理数据文件中的元素及其内容,并不影响脚本的解析方式。简短的回答是,你不能,也不应该。

如果您有重要的空白(例如两个跨需要一个空格来防止单词在一起运行),那么您将其添加到<xsl:text> </xsl:text>中。如果您没有有效的空白(例如,在<h1>..</h1> space <p>...之间),那么您不应该尝试添加它。

XML的存在是为了精确、可靠地将文档树从一个程序传输到另一个程序,而美观绝不是它的工作的一部分。XSLT不会添加空白,因为它不知道在哪里添加空白是安全的,也不会删除空白,因为它不知道空白在哪里有用。记住XSLT对HTML一无所知;它独立于标记语言。要做到这一点,XSLT需要知道它可以在块元素(h1p等)周围放置空格,但不能在span周围放置空格,否则可能会出现浮动标点符号:

my cunning paragraph with
<span>text</span>
, and more

以上显然是不能接受的输出。因为XSLT不知道哪些元素是安全的,哪些元素不是,所以它做出了明显正确的判断,并且不会为了美观的打印而冒险对数据进行错误处理。

XML不是为手工编写而设计的,也不是作为原始数据读取的。不要尝试。在Firefox中打开XML输出,它可以为您完成格式化,如果您希望它更漂亮,可以在另一个应用程序中完成。

为了完整起见,实际上有一种安全的方法可以在不影响间距的情况下进行漂亮的打印:
<root
  ><h1>The correct way of handling pretty-printing with XML</h1
  ><p
    >A test paragraph with a <span
    >span</span
    >, which won't break</p
  ></root
>

最后,取消ISO-8859-1。它必须消亡。尽量避免在p中出现h1