سؤال

أنا أعمل على ورقة أنماط Umbraco XSL وأنا عالق للغاية.

في الأساس ، لديّ معلمة أختبرها وأستخدمها في حالة وجودها ، وإلا فأنا أستخدم المعلمة الافتراضية $currentPage.

فيما يلي المعلمات

<xsl:param name="source" select="/macro/sourceId" />
<xsl:param name="currentPage" />

هذا هو المتغير

<xsl:variable name="current">
    <xsl:choose>
        <xsl:when test="$source &gt; 0">
            <xsl:copy-of select="umbraco.library:GetXmlNodeById($source)" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:copy-of select="$currentPage" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

وهنا أستخدمه

<xsl:for-each select="msxml:node-set($source)/ancestor-or-self::* [@isDoc and @level=$level]/* [@isDoc and string(umbracoNaviHide) != '1']">
... code here ...
</xsl:for-each>


شيء صغير

هذا يعمل

<xsl:variable name="source" select="$currentPage" />

هذا لا

<xsl:variable name="source">
  <xsl:copy-of select="$currentPage" /> <!-- Have tried using <xsl:value-of /> as well -->
</xsl:variable>

فكيف تقوم بنسخ متغير دون استخدام select="" ينسب.

تحديث: لقد حاولت استخدام نهج آخر (انظر أدناه) ولكن أحصل على ملف متغير خارج النطاق استثناء.

<xsl:choose>
    <xsl:when test="$source &gt; 0">
        <xsl:variable name="current" select="umbraco.library:GetXmlNodeById($source)" />
    </xsl:when>
    <xsl:otherwise>
        <xsl:variable name="current" select="$currentPage" />
    </xsl:otherwise>
</xsl:choose>
هل كانت مفيدة؟

المحلول

بشكل عام ، يختار هذا التعبير أحد العقدتين ، بناءً على ما إذا كان هناك شرط معين true() أو false():

$ns1[$cond] | $ns2[not($cond)]

في حالتك يترجم هذا إلى:

    umbraco.library:GetXmlNodeById($source) 
|
    $currentPage[not(umbraco.library:GetXmlNodeById($source))]

الكامل <xsl:variable> التعريف هو:

<xsl:variable name="vCurrent" select=
"        umbraco.library:GetXmlNodeById($source) 
    |
        $currentPage[not(umbraco.library:GetXmlNodeById($source))]
"/>

يمكن كتابة هذا بطريقة أكثر إحكاما:

<xsl:variable name="vRealSource" select="umbraco.library:GetXmlNodeById($source)"/>

<xsl:variable name="vCurrent" select=
    "$vRealSource| $currentPage[not($vRealSource)]"/>

نصائح أخرى

عندما تعلن وجود متغير في XSLT 1.0 بدون @select ، ولكن مع بعض قالب المحتوى ، سيكون النوع المتغير من شجرة النتيجة. يحمل المتغير عقدة الجذر لهذه الشجرة.

لذلك ، مع هذا:

<xsl:variable name="source"> 
  <xsl:copy-of select="$currentPage" />
</xsl:variable> 

أنت تعلن $source كجذر RTF يحتوي على ينسخ من العقد (الذات والأحفاد) في $currentPage مجموعة العقدة.

لا يمكنك استخدام / مشغل الخطوة مع RTF. لهذا السبب أنت USSING node-set وظيفة التمديد.

ولكن, ، عندما تقول:

node-set($source)/ancestor-or-self::*

سيتم تقييم هذا على مجموعة عقدة فارغة ، لأن عقدة الجذر لا تحتوي على أسلافها ليست عنصرًا.

تعديل: إذا كان لديك مجموعتان عقدة ، وتريد أن تعلن متغيرًا مع محتوى إحدى مجموعات العقدة اعتمادًا على بعض الحالة ، يمكنك استخدام:

<xsl:variable name="current" 
              select="umbraco.library:GetXmlNodeById($source)[$source > 0]
                      |$currentPage[0 >= $source]" /> 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top