هل يمكنني إنشاء قيمة مفقودة الوسم في XPath?

StackOverflow https://stackoverflow.com/questions/40361

  •  09-06-2019
  •  | 
  •  

سؤال

لدي طلب وهو استخراج البيانات من ملف 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

أنا أفهم هذا بشكل صحيح ، نحن لسلسلة الإجابة الافتراضية وقيمة عقده ، ومن ثم اتخاذ الصحيح فرعية من السلسلة الناتجة عن طريق اختبار وجود عقدة تعيين الإزاحة إما صفر أو الموقف بعد السلسلة الافتراضية.وهذا هو أبشع التواء لغة رأيت من أي وقت مضى.(أنا أحب ذلك!)

لتوضيح ما قلت هذا النهج يعمل عند العقدة مفقود ، وليس عند العقدة فارغة.ولكن من خلال استبدال "رقم(منطقية($عقدة))" مع "طول السلسلة($عقدة)" أنه سيتم العمل على إفراغ العقد بدلا من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top