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 に答える