如何使用混合内容精美打印XML

时间:2017-04-27 22:39:36

标签: php xml xslt

所以我有一个辩论系统,用户应该以下列格式发表他们的论点和反对意见:

<argument>Argument about something.
    <objection>Objection to the argument.
        <objection>Objection to the objection.</objection>
    </objection>
    <objection>Second objection to the argument.</objection>
</argument>

但我不能指望用户总是把它弄好,所以我需要一些方法来规范化/美化他们的输入。我尝试了标准方式:

$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->loadXML('<argument>a<objection>b</objection></argument>');
$dom->formatOutput = true;
echo $dom->saveXml();

但不幸的是这输出:

<argument>a<objection>b</objection></argument>
显然,这是因为标准的PHP漂亮打印忽略了所有混合内容XML。我做了一些研究,我认为XSL可能是关键。但我以前从未接触过它,所以我还不确定。任何人都可以确认并给我一个有用的指针或两个?也许是一个例子?谢谢!

1 个答案:

答案 0 :(得分:1)

与评论说的一样,这就是DOM表现出这种方式的原因。以此为例:

<text><firstChar>E</firstChar>xample</text>

结束firstChar标记后的中断/空格会改变含义并显示给用户。

XSLT处理器有点不同。它可以识别更多可能破坏的情况,因此格式不同。如果您正在编写XSLT模板,则忽略XSLT标记之间的空格,而将其他空格解释为中断。 xsl:text允许您按原样通过空格序列。但这不适用于XML中的节点。它们将按原样复制,否则意思可能会改变。