XPath/Xquery: حدد عقدة الجذر بسماتها بدون Childs
-
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