2010-09-14 119 views
4

我有一個xml:的XPath/XQuery的:選擇其屬性沒有孩子的根節點

<Customer id=""> 
<Name /> 
<Address /> 
</Customer> 

我想只選擇其屬性根節點沒有子節點:

<Customer id=""/ > 

XPath可能會出現這種情況嗎?

+0

好問題(1)。查看我的答案以獲取簡短的XSLT解決方案。 – 2010-09-14 13:34:44

回答

2

不,這在XPath中是不可能的。

你不能選擇節點沒有其子節點,因爲沒有它的子節點,它將是一個不同的節點,因此你不會從原始文檔中選擇一個節點。

要創建您想要的輸出,您需要使用允許您創建新節點的語言,因此您無法在XPath中執行此操作。您可以使用XQuery創建新的節點,這應該工作:

element {fn:node-name(/*)} {/*/@*} 
0
$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 />"; 
} 
+0

Thanx爲答案,但我需要XPath結構,因爲我在T-SQL中做的東西。就像:select @ XmlData.query('/ [nochildrenhere]') – Tim 2010-09-14 10:27:54

+0

啊,好吧,那我幫不了你,對不起! – Jordy 2010-09-14 10:30:36

2

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=""/> 
0

該XQuery表達式:

element {name(/*)} {/*/@*} 

輸出:

<?xml version="1.0" encoding="UTF-8"?><Customer id=""/> 
相關問題