4

我有一个xml:

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

我只想选择一个没有子节点的具有属性的根节点:

<Customer id=""/ >

XPath 有可能做到这一点吗?

4

4 回答 4

2

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

您不能选择没有子节点的节点,因为没有它的子节点,它将是一个不同的节点,因此您不会从原始文档中选择节点。

要创建您想要的输出,您需要使用一种允许您创建新节点的语言,因此您无法在 XPath 中执行此操作。您可以使用 XQuery 创建新节点,这应该可以:

element {fn:node-name(/*)} {/*/@*}
于 2010-09-14T12:52:07.470 回答
2

XPath 不会改变任何源 XML 文档,这是设计使然

要从现有的 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=""/>
于 2010-09-14T13:33:41.087 回答
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 />";
}
于 2010-09-14T10:25:21.977 回答
0

这个 XQuery 表达式:

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

输出:

<?xml version="1.0" encoding="UTF-8"?><Customer id=""/>
于 2010-09-14T21:37:38.470 回答