سؤال

لدي 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