هل يمكنني إنشاء قيمة مفقودة الوسم في XPath?
سؤال
لدي طلب وهو استخراج البيانات من ملف XML باستخدام XPath.إذا عقدة في أن مصدر XML ملف مفقود أريد أن أعود قيمة "N/A" (مثل أوراكل NVL وظيفة).الحيلة هي أن التطبيق لا يدعم XSLT;أود أن تفعل هذا باستخدام XPath و XPath وحده.
هل هذا ممكن ؟
المحلول
ويمكن أن يتم ذلك ولكن فقط إذا كانت قيمة الإرجاع عند العقدة موجودة سلسلة قيمة عقدة ليس العقدة نفسها.XPath
substring(concat("N/A", /foo/baz), 4 * number(boolean(/foo/baz)))
سوف تعود السلسلة القيمة baz
العنصر إذا كان موجودا وإلا سلسلة "N/A".
تعميم النهج:
substring(concat($null-value, $node),
(string-length($null-value) + 1) * number(boolean($node)))
حيث $null-value
هو قيمة null سلسلة $node
التعبير حدد العقدة.ملاحظة أنه إذا $node
يقيم إلى عقدة-مجموعة تحتوي على أكثر من عقدة السلسلة القيمة أولا العقدة المستخدمة.
نصائح أخرى
الجواب القصير:لا.هذه الوظيفة تعتبر رفض صراحة الإصدار 2 من XPath المواصفات (انظر غير المعيارية توضيحية كتب المستخدم وظائف القسم).
فارغة العقد ، تحتاج
boolean(string-length($node))
(يمكنك حذف الدعوة إلى number()
كما يلقي من منطقية أن عدد ضمنا هنا.)
ويمكن أن يتم ذلك باستخدام XPath 1.0.نقول لديك
<foo>
<bar/>
</foo>
إذا كنت ترغب في اختبار إذا foo
لديه baz
الطفل ،
substring("N/A", 4 * number(boolean(/foo/baz)))
سيعود "N/A" إذا كان التعبير /foo/baz
ترجع فارغة عقدة ، وإلا فإنه بإرجاع سلسلة فارغة.
@jelovirt
أنا أفهم هذا بشكل صحيح ، نحن لسلسلة الإجابة الافتراضية وقيمة عقده ، ومن ثم اتخاذ الصحيح فرعية من السلسلة الناتجة عن طريق اختبار وجود عقدة تعيين الإزاحة إما صفر أو الموقف بعد السلسلة الافتراضية.وهذا هو أبشع التواء لغة رأيت من أي وقت مضى.(أنا أحب ذلك!)
لتوضيح ما قلت هذا النهج يعمل عند العقدة مفقود ، وليس عند العقدة فارغة.ولكن من خلال استبدال "رقم(منطقية($عقدة))" مع "طول السلسلة($عقدة)" أنه سيتم العمل على إفراغ العقد بدلا من ذلك.