سؤال

أحاول استخدام متغيرات XSLT ولم أحقق نجاحًا كبيرًا، وآمل أن أفعل شيئًا غبيًا.

لدي مقتطف الكود التالي:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xalan="http://xml.apache.org/xslt"
  version="1.0">

    <xsl:template match="/">
      <xsl:variable name="config" select="query/@config"></xsl:variable>

لذلك أتوقع أن يكون هناك متغير "config" تم تعيينه على قيمة السمة "config" لعنصر المستوى الأعلى "الاستعلام".

ثم أحاول بعد ذلك استخدام المتغير لاحقًا في ورقة الأنماط الخاصة بي، على سبيل المثال:

<a href="localhost/test?go">
    {$config}
</a>

لكن الإخراج الذي أراه في مستند HTML الناتج هو:

<a href="localhost/test?go">
    {$config}
</a>

لذلك لم يتم استبدال القيمة كما كنت أتوقع.

أعتقد أن هذه أبسط حالة يمكن أن تكون، لذا فأنا أفعل شيئًا غبيًا!الرجاء المساعدة، شكرا!


تحديث، شكرًا لجميع من استجابوا، لقد أساءت فهم السياقات المختلفة سواء كنت أعمل في إحدى السمات أو خارجها.فرز مشكلتي بشكل جيد!

إذا كان بإمكاني قبول إجابتين، تلك التي أملكها، وإجابة @Aaron Digulla، التي أوضحت موضوع السمات.

هل كانت مفيدة؟

المحلول

في ورقة الأنماط يجب استخدام:

<xsl:value-of select="$config"/>

وبدلا من:

{$config}

نصائح أخرى

هناك سؤالان هنا يبدوان متماثلين، لكنهما مختلفان تمامًا:1) كيف هل يمكنني الإشارة إلى متغير بالاسم؟2) أين هل يمكنني الإشارة إلى متغير بالاسم؟

أولاً، تتم الإشارة دائمًا إلى المتغيرات باستخدام التابع $varname بناء الجملة.ثانيا، يمكن القيام بذلك في أي مكان يسمح بالتعبير.إنه الجزء الثاني من هذا الذي يبدو محيرًا.للبدء، سيتم افتراضيًا إخراج قيمة العنصر أو السمة بشكل حرفي، لذلك لا تتم الإشارة فعليًا إلى أي متغيرات في المثال التالي:

<element attr="$test">$test or {$test}</element>

سوف يتطابق الإخراج حرفيًا مع ما تم كتابته.

لإخراج قيمة متغير، نحتاج إلى الرجوع إليها حيث يُسمح بالتعبير.في محتوى العنصر نستخدم xsl:value-of;في السمات التي يتم التعامل معها على أنها قالب قيمة السمة (على سبيل المثالسمات عنصر النتيجة الحرفية)، يتم تحديد التعبيرات بأقواس متعرجة {}.افترض التصريح التالي:

<xsl:variable name="test" select="'value'"/>

….ثم ما يلي:

<element attr="{$test}"><xsl:value-of select="$test"/></element>

...النتائج في:

<element attr="value">value</element>

بعض الملاحظات الفراق على AVTs و value-of:

  • في كلتا الحالتين تمت الإشارة إلى المتغير كـ $test.الأقواس الموجودة في AVT ليست جزءًا من المرجع المتغير؛فهي محددات التعبير.
  • في كلتا الحالتين، ليس من الضروري أن يحتوي التعبير على إشارة إلى متغير؛سيتم السماح بأي تعبير XPath.
  • لا يتم التعامل مع كافة السمات الموجودة في مستند XSLT كقوالب قيمة السمات.على سبيل المثال، لاحظ ذلك xsl:valueselect يصف يقبل بالفعل التعبير كمحتوى.
  • سؤال:لماذا لا يمكنك استخدام value-of في صفة مثل هذه؟

    <element attr="<xsl:value-of select="$test"/>"/>
    

    إجابة:لأن مستندات XSLT يجب أن تحتوي على XML جيد التصميم (وهذا ليس كذلك).

  • سؤال:لماذا لا يمكنك استخدام {$varname} في محتوى العنصر؟

    إجابة عفوية:لأن منشئي XSLT لم يصمموه بهذه الطريقة.

و{$config} يعمل فقط في سمات عناصر XSLT. (ملاحظة: الدولار داخل قوس لأن تعبير XPath كامل يجب أن تكون محاطة بأقواس)

استخدم <xsl:value-of select="$config"/> بدلا من {$config}.

إجابة @lwburk رائعة (+1)، لكن السؤال/الإجابة الأخيرة دقيقة فقط لـ XSLT 1.0 و2.0.في الإصدار 3.0 يمكنك استخدام TVT (قالب قيمة النص;مشابه لـ AVT (قالب قيمة السمة) المذكور في إجابة @ lwburk).

لاستخدام TVT، أضف السمة القياسية xsl:expand-text="yes" إلى العنصر.سيؤدي هذا إلى قيام المعالج بمعاملة العقد النصية المنحدرة من هذا العنصر على أنها TVT.

مثال:

اكس اس ال تي 3.0

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes"/>

    <xsl:template match="/">
        <xsl:variable name="who" select="'Dan'"/>
        <xsl:variable name="what" select="'BAM!'"/>
        <result xsl:expand-text="yes">This is {$who}'s result: {$what}</result>
    </xsl:template>

</xsl:stylesheet>

انتاج | (باستخدام أي ملف XML جيد التكوين كمدخل)

<result>This is Dan's result: BAM!</result>

ملحوظة:تم اختباره باستخدام Saxon-PE 9.5.

ولأنك بحاجة إلى استخدام <xsl:value-of select="config"/>؟

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