XSLT & XPath Syntax> كيفية الرجوع إلى عنصر في نطاق "الخارجي"

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

  •  12-09-2019
  •  | 
  •  

سؤال

لدي العمل التالي بنسبة 100٪ بشكل صحيح. ومع ذلك لإرضاء فضولي ... هل هناك طريقة لتحقيق نفس الشيء دون إعلان متغير جهد؟ هل هناك طريقة للإشارة إليها من داخل حالة "اختبار" XPath؟

يجب أن يشير الاستعلام XPath في الحالة إلى سمات 2 @ لمعرفة ما إذا كانت تتطابق.

  • "الحالية"id
  • كل "سلف'ID

إليك الرمز:

<xsl:variable name="currentID" select="@id" />
<xsl:attribute name="class">
<xsl:if test="count($currentPage/ancestor::node [@id = $currentID])&gt;0">descendant-selected </xsl:if>
</xsl:attribute>
هل كانت مفيدة؟

المحلول

منذ اختيار $currentID من عقدة السياق:

<xsl:variable name="currentID" select="@id" />

يمكنك استعمال ال current() وظيفة، والتي تشير دائما إلى عقدة سياق XSLT:

<xsl:attribute name="class">
  <xsl:if test="count($currentPage/ancestor::node[@id = current()/@id) &gt; 0]">
    <xsl:text>descendant-selected </xsl:text>
  </xsl:if>
</xsl:attribute>

بهذه الطريقة لا تحتاج إلى متغير.

بعض الملاحظات الأخرى:

  • أوصي باستخدام <xsl:text> كما هو موضح أعلاه. يمنحك هذا المزيد من الحرية لتنسيق الرمز الخاص بك وتجنب الخطوط الطويلة الطويلة.
  • لا تحتاج إلى القيام count() > 0, ، ما عليك سوى اختيار العقد كافية. إذا لم تكن هناك، يتم إرجاع مجموعة العقدة الفارغة. يقيم دائما false، في حين أن مجموعات العقدة غير الفارغة تقيم دائما إلى True.

إذا كنت تشير إلى العقد من قبل @id بانتظام في ورقة أنماط XSL الخاصة بك، <xsl:key> سوف تصبح مفيدة:

<xsl:key name="kNodeById" match="node" use="@id" />

<!-- ... -->

<xsl:attribute name="class">
  <xsl:if test="key('kNodeById', @id)">
    <xsl:text>descendant-selected </xsl:text>
  </xsl:if>
</xsl:attribute>

ما سبق لا يحتاج current() منذ خارج الإصدار XPath المسند، لم يتغير السياق. أيضا، أنا لا count() العقد، لأن هذا زائد (كما هو موضح).

نصائح أخرى

استخدم الحالي () للإشارة إلى العقدة الحالية التي تمت معالجتها بواسطة القالب:

<xsl:if test="count($currentPage/ancestor::node [@id = current()/@id])&gt;0">

حصلت تيم على التفكير .... أعتقد أنني كنت أكثر من تعقيد الأشياء، وحاولت ما يلي الذي يعمل.

<xsl:if test="@id = $currentPage/ancestor::node/@id">descendant-selected </xsl:if>

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

كما أصبح واضحا بالفعل، فإن الإشارة إلى "النطاق الخارجي" لم يكن مشكلة، حيث يمكنك القيام بمقارنة مباشرة باستخدام المشغل "=". ومع ذلك، هناك بعض الحالات التي تحتاج فيها الحالية () وأكثر من ذلك إلى جانب حيث حتى الحالية () لا يقطعها (لأنك تحتاج إلى "الانضمام" بين أكثر من سياقتين فقط). في تلك الحالات، لا غنى عن تعبيرات XPath 2.0's "for".

يمكنك ببساطة القيام:

<xsl:if test="count($currentPage[ancestor::node/@id = @id])&gt;0">descendant-selected </xsl:if>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top