2010-09-14 80 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=""/> 
相关问题