我有一个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