私はxmlを持っています:
<Customer id="">
<Name />
<Address />
</Customer>
子ノードなしで属性を持つルート ノードのみを選択したいと思います。
<Customer id=""/ >
XPathでそのようなことは可能ですか?
私はxmlを持っています:
<Customer id="">
<Name />
<Address />
</Customer>
子ノードなしで属性を持つルート ノードのみを選択したいと思います。
<Customer id=""/ >
XPathでそのようなことは可能ですか?
いいえ、これはXPathでは不可能です。
子がないと別のノードになるため、子がないとノードを選択できません。したがって、元のドキュメントからノードを選択することはできません。
必要な出力を作成するには、新しいノードを作成できる言語を使用する必要があるため、XPathでは作成できません。XQueryを使用して新しいノードを作成できます。これは機能するはずです。
element {fn:node-name(/*)} {/*/@*}
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=""/>
$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=""/>