我有一個xml:的XPath/XQuery的:選擇其屬性沒有孩子的根節點
<Customer id="">
<Name />
<Address />
</Customer>
我想只選擇其屬性根節點沒有子節點:
<Customer id=""/ >
XPath可能會出現這種情況嗎?
我有一個xml:的XPath/XQuery的:選擇其屬性沒有孩子的根節點
<Customer id="">
<Name />
<Address />
</Customer>
我想只選擇其屬性根節點沒有子節點:
<Customer id=""/ >
XPath可能會出現這種情況嗎?
不,這在XPath中是不可能的。
你不能選擇節點沒有其子節點,因爲沒有它的子節點,它將是一個不同的節點,因此你不會從原始文檔中選擇一個節點。
要創建您想要的輸出,您需要使用允許您創建新節點的語言,因此您無法在XPath中執行此操作。您可以使用XQuery創建新的節點,這應該工作:
element {fn:node-name(/*)} {/*/@*}
$doc = new DOMDocument();
$doc->loadHTML($str);
$xPath = new DOMXpath($doc);
$xPathQuery = "//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), '<Customer id=\"\">')]";
$elements = $xPath->query($xPathQuery);
if($elements->length > 0){
foreach($elements as $element){
print "Found: " .$element->nodeValue."<br />";
}
XPath不改變任何來源的XML文檔,這是由設計。
要從現有的文檔生成新的XML文檔,需要轉換。
XSLT專門用於將一組樹(包括XML文檔)轉換爲結果樹。
這種轉變:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/*">
<xsl:copy>
<xsl:copy-of select="@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
時所提供的XML文檔應用:
<Customer id="">
<Name />
<Address />
</Customer>
產生想要的,正確的結果:
<Customer id=""/>
該XQuery表達式:
element {name(/*)} {/*/@*}
輸出:
<?xml version="1.0" encoding="UTF-8"?><Customer id=""/>
好問題(1)。查看我的答案以獲取簡短的XSLT解決方案。 – 2010-09-14 13:34:44