XSLT: قيمة السمة المستخدمة كمسند رقمي
-
24-09-2019 - |
سؤال
منح
<xsl:variable name="datePrecision" as="element()*">
<p>Year</p>
<p>Month</p>
<p>Day</p>
<p>Time</p>
<p>Timestamp</p>
</xsl:variable>
التعبير
$datePrecision[5]
إرجاع مجموعة محددة تحتوي على عقدة نصية واحدة ذات قيمة "Timestamp" ، كما هو متوقع.
في وقت لاحق في قالب ، مع وجود عنصر سياق له سمة
@precision="5"
أحاول التعبيرات التالية ولكن جميعها تُرجع سلسلة فارغة:
$datePrecision[@precision]
$datePrecision[number(@precision)]
$datePrecision[xs:decimal(@precision)]
ومع ذلك ، فإن التسلسل التالي يفعل ما أريد
<xsl:variable name="prec" select="number(@precision)"/>
... $datePrecision[$prec] ...
باستخدام مصحح الأخطاء في Oxygen/XML لقد صعدت إلى النقطة التي يكون فيها التعبير على وشك تقييم وعرض ما يلي في نافذة الساعة:
Expression Value Nodes/Values Set
-------------------------- --------------- -----------------------
$datePrecision[5] Node Set(1) #text Timestamp
@precision Node Set(1) precision 5
$datePrecision[@precision]
number(@precision) 5
$datePrecision[number(@precision)]
$prec 5
$datePrecision[$prec] Node Set(1) #text Timestamp
من الواضح أنني فاتني شيء أساسي حول كيفية ذرية عقد السمة للاستخدام في مسند ، لكن لا يمكنني العثور على أي شيء في المستندات (Michael Kay's XSLT/XPath 2.0 ، 4th ED) من شأنه أن يفسر هذا الاختلاف.
هل يمكن لأحد أن يشرح سبب حدوث ذلك ، ويوجهني إلى أين ، في إما كتاب XSLT 2.0 أو كتاب مايكل كاي ، حيث يتم وصف هذا؟
(معالج XSLT هو Saxon-PE 9.2.0.3)
المحلول
من الواضح أنني فاتني شيء أساسي
نعم. تعبير XPath:
$datePrecision[@precision]
يعني: جميع العناصر في $datePrecision
التي تسمى سمة precision
.
لكن انت تريد @precision
لتعني السمة المسمى precision
من عقدة currnet التي يقابلها القالب.
يوفر XSLT current()
تعمل بالضبط لهذا الغرض. يستخدم:
$datePrecision[current()/@precision]
تحديث: كما ألمح مارتن هونن ، ربما يريد البروتوكول الاختياري الحصول على العنصر الخامس من $datePrecision
- شيء غير مرئي على الفور من وصف المشكلة. في هذه الحالة ، قد يكون من الضروري استخدام:
$datePrecision[position() = current()/@precision]