XPath/XQuery:チャイルドなしで属性を持つルートノードを選択します
-
02-10-2019 - |
質問
私はXMLを持っています:
<Customer id="">
<Name />
<Address />
</Customer>
子ノードのない属性を持つルートノードのみを選択したいと思います。
<Customer id=""/ >
Xpathでそのようなことは可能ですか?
解決
いいえ、これはXpathでは不可能です。
できません 選択する 子供がいないと子供がいないため、それは別のノードになるため、元のドキュメントからノードを選択しないため、子供のいないノード。
出力を作成するには、新しいノードを作成できる言語を使用する必要があるため、Xpathではできません。 XQueryを使用して新しいノードを作成できます。これは機能するはずです。
element {fn:node-name(/*)} {/*/@*}
他のヒント
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=""/>
$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 />";
}
このXquery式:
element {name(/*)} {/*/@*}
出力:
<?xml version="1.0" encoding="UTF-8"?><Customer id=""/>
所属していません StackOverflow