XSLT تطبيق الفرز إلى القيمة الثانية إذا كان الأول فارغا

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

  •  18-09-2019
  •  | 
  •  

سؤال

لدي مقابل كل حلقات جولة أخبار العقد. من بين خصائص أخرى هذه الأخبار لها سمات اثنين من تاريخ الإنشاء. تاريخ إضافة النظام ومستخدم تم إنشاؤه تاريخا (لتجاوز تاريخ النظام). أرغب في القائمة المرتبة حسب التاريخ الذي تم إنشاؤه مع تفضيل التاريخ الذي تم إدخاله في المستخدم.

أدناه هي محاولة متواضعة غير صالحة!

<xsl:for-each select="$currentPage/ancestor-or-self::node /node [@nodeTypeAlias = $documentTypeAlias and string(data [@alias='umbracoNaviHide']) != '1']">

<xsl:choose>
 <xsl:when test="data [@alias = 'createdDate'] != ''">
  <xsl:variable name="sort" select="string(data [@alias = 'createdDate'])"/>
 </xsl:when>
 <xsl:otherwise>
  <xsl:variable name="sort" select="string(@createDate)"/>
 </xsl:otherwise>
</xsl:choose>

<xsl:sort select="$sort" order="descending"/>

تشكرات

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

المحلول

<xsl:sort select="(data[@alias='createdDate' and normalize-space() != '']|@createDate)[last()]" order="descending" />

يقوم هذا البيان بإنشاء Nodeset مع العقدتين المحتوية على التاريخ، واحصل على آخر واحد وفقا لترتيب المستند للقيام بالفرز. إذا بيانات توجد العقدة ولا تكون فارغة، وسيتم استخدامها للفرز لأن عناصر الأطفال للعنصر تحدث بعد عقد السمة.

ConcAT () لا يمكن أن تعمل فقط، وفي حالات قليلة، إذا كنت تستخدم الفرز النصي؛ سوف تفشل مع الفرز الرقمي.

نصائح أخرى

صحيح، يبدو وكأنه اختراق ولكن تمكنت من تحقيق ذلك باستخدام concat مع الفرز.

مثال أدناه

<xsl:for-each select="$currentPage/ancestor-or-self::node /node [@nodeTypeAlias = $documentTypeAlias and string(data [@alias='umbracoNaviHide']) != '1']">
<xsl:sort select="concat(data [@alias = 'createdDate'],@createDate)" order="descending"/>

لاختبار ما إذا كانت العقدة فارغة (أو حذفها) في XSLT:

<xsl:when test="not(string(name))">...</xsl:when>
<!-- or -->
<xsl:when test="not(name)">...</xsl:when>

شكرا جزيلا ل Erlock لحله. لقد تكافح من أجل الحصول على هذا العمل في نسختي من UMBRACO (4.7.1) بسبب التغييرات التي تم إجراؤها على بناء جملة UMBRACO XSLT.

لأي شخص مهتم، ستعمل عينة العمل الخاصة بي على تغيير رمز ERLOCK؛

<xsl:sort select="(current()/createdDate[normalize-space() != '']|@createDate)[last()]" order="descending" />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top