سؤال
أنا أعمل على ورقة أنماط Umbraco XSL وأنا عالق للغاية.
في الأساس ، لديّ معلمة أختبرها وأستخدمها في حالة وجودها ، وإلا فأنا أستخدم المعلمة الافتراضية $currentPage
.
فيما يلي المعلمات
<xsl:param name="source" select="/macro/sourceId" />
<xsl:param name="currentPage" />
هذا هو المتغير
<xsl:variable name="current">
<xsl:choose>
<xsl:when test="$source > 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 > 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]" />