我需要使用 Xpath 運算式洗掉 XML 中的空節點。
讓我們考慮以下示例 XML。其中,不需要 'nickname' 和 'height' 節點,因為它們是空的。
原始資料
<class>
<student rollno = "393">
<firstname>Dinkar</firstname>
<lastname>Kad</lastname>
<nickname></nickname>
<marks>85</marks>
<height></height>
</student>
</class>
預期資料
<class>
<student rollno = "393">
<firstname>Dinkar</firstname>
<lastname>Kad</lastname>
<marks>85</marks>
</student>
</class>
uj5u.com熱心網友回復:
您可以使用帶有謂詞 not(node()) 的 XPath 來選擇所有沒有子節點的元素。
例如:
<?php
$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
$doc->loadxml('<parentnode>
<tag1>2</tag1>
<tag2>4</tag2>
<tag3></tag3>
<tag2>4</tag2>
<tag3></tag3>
<tag2>4</tag2>
<tag3></tag3>
</parentnode>');
$xpath = new DOMXPath($doc);
foreach( $xpath->query('//*[not(node())]') as $node ) {
$node->parentNode->removeChild($node);
}
$doc->formatOutput = true;
echo $doc->savexml();
印刷
<?xml version="1.0"?>
<parentnode>
<tag1>2</tag1>
<tag2>4</tag2>
<tag2>4</tag2>
<tag2>4</tag2>
</parentnode>
uj5u.com熱心網友回復:
XPath運算式針對那些空元素是:*[not(node())]。
但是,您不能使用 XPath 轉換 XML。
我將應用以下 XSLT 樣式表,它有一個復制所有內容的默認模板和一個沒有任何子節點(沒有元素或text())的特殊模板匹配元素為空,這意味著這些元素被洗掉。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(node())]"/>
</xsl:stylesheet>
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/378868.html
