تصفية XSLT والمؤشرات على مجموعة العقدة
سؤال
أحاول أن أعزز العقدة السابقة في A-ECH باستخدام المحور السابق للبلاغ ، ومرشح ومؤشر للعثور عليه.
المشكلة هي أنني أريد فقط العنصر الأول الذي يطابق XPath في المحدد ، ومع ذلك ، يبدو أنني غير قادر على تطبيق كل من المرشح والمؤشر. يبدو أن المفهرس يتغلب على المرشح ، لذا أحصل دائمًا على أول الأخوة السابقة بدلاً من أول واحد يطابق المرشح.
لقد حاولت وضع هذا في متغير داخل foreach ، ولكن نظرًا لأنه لا يمكن تغيير المتغير ، فإن مجموعة العقد هي دائمًا هي قيم الأخوة السابقة للبند الثاني.
إليك الكود ذي الصلة (قطع أكبر قدر ممكن من الضوضاء). يعتذر عن ضوضاء Umbraco (XSLT هو لتوليد بعض العلامات المعقدة إلى حد ما للبطانة الفرعية التي لا يمكنني تغييرها بسهولة).
<xsl:for-each select="$currentPage/ancestor-or-self::node[(@nodeTypeAlias='Discover' or @nodeTypeAlias='CampaignHome') and data[@alias='umbracoNaviHide'] != 1]/child::node[(@nodeTypeAlias='Discover' or @nodeTypeAlias='CampaignHome') and data[@alias='umbracoNaviHide'] != 1]">
<!--This variable is always set to the second item's preceding sibling-->
<xsl:variable name="precedingItem" select="preceding-sibling::node[data[@alias='umbracoNaviHide' != 1]]" />
<!--This variable always contains the second item even if /data/@alias='umbracoNaviHide' = 1 -->
<xsl:variable name="predingItemWithIndexer" select="preceding-sibling::node[data[@alias='umbracoNaviHide' != 1]][1]" />
<!-- this always prints out the id of the first item -->
<xsl:value-of select="position()" /> <xsl:value-of select="$precedingItem[1]/@id" />
</xsl:foreach>
أود استخدام المحدد الثاني المضمّن ولكن نظرًا لأن مرشح الفهرس يتجاوز المرشح الآخر ، فإنه لا يعطي القيم الصحيحة عندما يكون umbraconavihide = 1.
المحلول
preceding-sibling::node[data[@alias='umbracoNaviHide' != 1]]
هذا يعنى: حدد كل الأخوة السابقة node
عناصر لديها طفل واحد على الأقل data
عنصر بدون alias
السمة أو مع alias
السمة لا تساوي "umbraconavihide"
تعديل: هذا هو XPath الصحيح لهذا:
كنت أرغب في أول عنصر عقدة سابق يحتوي على عنصر بيانات يحتوي على اسم مستعار سمة يسمى Umbraconavihide والذي لا يحتوي على القيمة 1.
preceding-sibling::node[data[@alias='umbracoNaviHide']!=1][1]