PHP中的XSLTProcessor总是删除空格

时间:2011-08-31 14:25:26

标签: php xslt whitespace

我正在尝试使用XSLTProcessor将一些XML和一个XSLT样式表组合成一个html文件。 但是,它始终会导致输出1行的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。 任何人都有任何想法?

1 个答案:

答案 0 :(得分:1)

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

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

XML可以精确,可靠地将文档树从一个程序转移到另一个程序,而漂亮绝不是其工作的一部分。 XSLT不会添加空格,因为它不知道这样做是否安全,并且不会将其删除,因为它不知道哪个地方有用。记住XSLT对HTML一无所知;它是独立的标记语言。为了做你想做的事,XSLT需要知道它可以在块元素(h1p等)周围放置空间,但不能在spans周围放置空间,否则你可能会得到浮动标点符号:

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。它必须死。尽量避免h1内的p