質問

私は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=""/>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top