preserveWhiteSpace を false に設定し、formatOutput を true に設定して PHP の DOMDocument を使用すると、同じ要素内であっても、混合コンテンツの空白が一貫して保持されません。
Source XML:
<p><span>one</span> <span>two</span> text <span>three</span> <span>four</span></p>
Expected output:
<p><span>one</span> <span>two</span> text <span>three</span> <span>four</span></p>
Actual output (space lost between "one" and "two"):
<p><span>one</span><span>two</span> text <span>three</span> <span>four</span></p>
別の例を使用すると、場合によっては空白が保持されることがわかります。
$examples = array(
'<p>text <span>one</span> <span>two</span> text <span>three</span> <span>four</span></p>',
'<p><span>one</span> <span>two</span> text <span>three</span> <span>four</span></p>',
);
foreach ($examples as $example) {
$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
$doc->loadXML($example);
$doc->formatOutput = true;
print $doc->saveXML();
}
// <p>text <span>one</span> <span>two</span> text <span>three</span> <span>four</span></p>
// <p><span>one</span><span>two</span> text <span>three</span> <span>four</span></p>
libxml が混合コンテンツを検出するために使用するヒューリスティックは、要素内で前方を見ないため、実際のテキストを含むテキスト ノードが見つかった場合にのみ、空のテキスト ノードの保持を開始すると推測しています。
これは a) libxml のバグ (自動フォーマットは危険である可能性があることを警告しているにもかかわらず) および/または b) DTD を使用して回避できるものですか?