【问题标题】:How to pretty-print XML with mixed content如何漂亮地打印混合内容的 XML
【发布时间】:2017-09-25 21:53:04
【问题描述】:

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

<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 可能是关键。但我以前从来没有接触过,所以我还不确定。任何人都可以确认并给我一两个有用的指针吗?也许是一个例子?谢谢!

【问题讨论】:

  • protip:有更多的结构。一段数据是“一件事”吗?标记它。比如参数中的纯文本是一个东西,为什么没有标记? “异议”中的纯文本也是如此:那是什么文本?这本身就是反对意见吗?你需要 more 结构在这个数据 =)
  • 印刷精美。因为您在根级别有一个未封闭的文本,所以它保持一行。删除 a 或将其放在节点中,您将看到缩进。

标签: php xml xslt


【解决方案1】:

就像 cmets 所说的,这就是 DOM 如此行事的原因。举个例子:

&lt;text&gt;&lt;firstChar&gt;E&lt;/firstChar&gt;xample&lt;/text&gt;

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

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

【讨论】:

    猜你喜欢
    • 2016-01-02
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    相关资源
    最近更新 更多