إعادة استخدام المتغير المحدد داخل الاختيار، خارج الاختيار في XSLT

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

  •  05-07-2019
  •  | 
  •  

سؤال

لدي جزء من الكود يشبه هذا:

<xsl:choose>
   <xsl:when test="some_test">   
      <xsl:value-of select="Something" />
      You are:
      <xsl:variable name="age">12</xsl:variable>
      years
   </xsl:when>
</xsl:choose>

مشكلتي هي أنني أرغب في استخدام المتغير $age خارج نطاق الاختيار.كيف يمكنني فعل ذلك؟

هناك مشكلة مماثلة وهي أن لدي عدة قوالب في ملف XSLT الخاص بي، وأحدها هو القالب الرئيسي.هذا:

<xsl:template match="/">
</xsl:template>

داخل هذا القالب، أقوم باستدعاء العديد من القوالب الأخرى، ومرة ​​أخرى أرغب في استخدام بعض المتغيرات من القوالب الأخرى.

على سبيل المثال، إذا كان لدي هذا الرمز:

<xsl:template match="/">
   <xsl:call-template name="search">
   </xsl:call-template>
</xsl:template>

<xsl:template name="search">
   <xsl:variable name="searchVar">Something...</xsl:variable>
</xsl:template>

ثم أرغب في استخدام $searchVar داخل القالب الرئيسي الخاص بي.

إنها نفس المشكلة على ما أعتقد، لكن يبدو أنني لا أستطيع حل هذه المشكلة.

وأنا أقوم بتشغيل Umbraco باعتباره نظام إدارة المحتوى (CMS) الخاص بي بالمناسبة :)

آمل أن يكون لدى البعض منكم الإجابة.

شكرا - كيم

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

المحلول

إلى 1:المتغيرات صالحة داخل العنصر الأصلي الخاص بها فقط.مما يعني أنه يجب عليك وضع المنطق داخل المتغير بدلاً من "حوله":

<xsl:variable name="var">
  <xsl:choose>
    <xsl:when test="some_test">
      <xsl:text>HEY!</xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>SEE YA!</xsl:text>
    </xsl:otherwise>
  </xsl:choose>
</xsl:variable>

إلى 2:استخدم المعلمات لنقل القيم إلى القوالب.

<xsl:template match="/">
  <xsl:variable name="var" select="'something'" />

  <!-- params work for named templates.. -->
  <xsl:call-template name="search">
    <xsl:with-param name="p" select="$var" />
  </xsl:call-template>

  <!-- ...and for normal templates as well -->
  <xsl:apply-templates select="xpath/to/nodes">
    <xsl:with-param name="p" select="$var" />
  </xsl:apply-templates>
</xsl:template>

<!-- named template -->
<xsl:template name="search">
  <xsl:param name="p" />

  <!-- does stuff with $p -->
</xsl:template>

<-- normal template -->
<xsl:template match="nodes">
  <xsl:param name="p" />

  <!-- does stuff with $p -->
</xsl:template>

لنقل قيمة مرة أخرى إلى قالب الاستدعاء، قم بدمج ما سبق:

<xsl:template match="/">
  <xsl:variable name="var">
    <xsl:call-template name="age">
      <xsl:with-param name="num" select="28" />
    </xsl:call-template>
  </xsl:variable>

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

<xsl:template name="age">
  <xsl:param name="num" />

  <xsl:value-of select="concat('You are ', $num, ' years yold!')" />
</xsl:template>

نصائح أخرى

القي نظرة على xsl:param.

يحرر:لم يتم اختباره، ولكن قد يعمل:

<xsl:param name="var">
  <xsl:choose>
   <xsl:when test="some_test">   
     <xsl:value-of select="string('HEY!')" />
   </xsl:when>
  </xsl:choose>
</xsl:param>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top