سؤال

منح

<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]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top