سؤال

لدي اثنين من حلقة متداخلة في XSL مثل هذا، في هذه اللحظة أستخدم المنصب () ولكنها ليست ما أحتاج إليه.

<xsl:for-each select="abc">
  <xsl:for-each select="def">
   I wanna my variable in here increasing fluently 1,2,3,4,5.....n
not like 1,2,3,1,2,3
  </xsl:for-each>
</xsl:for-each>

هل يمكن أن تعطيني فكرة عن هذا الروتين. شكرا جزيلا!

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

المحلول

مع XSL، المشكلة هي أنه لا يمكنك تغيير متغير (الأمر أكثر مثل ثابت أنك تحدد). لذا فإن زيادة متغير عداد لا يعمل.

يمكن أن يكون هناك حل خرقاء للحصول على عدد متتابع (1،2،3،4، ...) هو الاتصال بموضع علامة ") للحصول على تكرار علامة" ABC "، ومكالمة أخرى إلى وضع () للحصول على" Def المتداخلة " "التكرار العلامة. سوف تحتاج بعد ذلك بضرب التكرار "ABC" مع عدد علامات "DEF" التي تحتوي عليها. لهذا السبب هذا هو الحل البديل "الخرقاء".

على افتراض أن لديك علامات "def" المتداخلة، ستبدو XSL كما يلي:

<xsl:for-each select="abc">
    <xsl:variable name="level1Count" select="position() - 1"/>
    <xsl:for-each select="def">
        <xsl:variable name="level2Count" select="$level1Count * 2 + position()"/>
        <xsl:value-of select="$level2Count" />
    </xsl:for-each>
</xsl:for-each>

نصائح أخرى

فقط قم بتغيير طريقة تحديد العناصر إلى حلقة:

<xsl:for-each select="abc/def">
    <xsl:value-of select="position()"/>
</xsl:for-each>

إذا كنت بحاجة خصيصا للحفاظ على الحلقات المتداخلة، ففكر في إضافة حلقة أخرى مثل هذا:

<xsl:variable name="items" select="//abc/def"/>
<xsl:for-each select="abc">
    <xsl:for-each select="def">
        <xsl:variable name="id" select="generate-id()"/>
        <xsl:for-each select="$items">
            <xsl:if test="generate-id()=$id">
                 <xsl:value-of select="position()"/>
            </xsl:if>
        </xsl:for-each>
    </xsl:for-each>
</xsl:for-each>
<xsl:for-each select="abc">
    <xsl:variable name="i" select="position()"/>
    <xsl:for-each select="def">
        <xsl:value-of select="$i" />
    </xsl:for-each>
</xsl:for-each>

هذا امتداد إجابة Pythonquick التي تعالج أرقام مختلفة من العناصر الفرعية:

<xsl:for-each select="abc">  
    <xsl:variable name="level1Position" select="position()"/>
    <xsl:variable name="priorCount" select="count(../abc[position() &lt; $level1Position]/def)"/>  
    <xsl:for-each select="def">
        <xsl:variable name="level2Count" select="$priorCount + position()"/>
        <xsl:value-of select="$level2Count" />
    </xsl:for-each>
</xsl:for-each>

إدخال:

<root>
    <abc>
        <def>A</def>
        <def>B</def>
        <def>C</def>
    </abc>
    <abc>
        <def>D</def>
        <def>E</def>
    </abc>
    <abc>
        <def>F</def>
    </abc>
    <abc>
        <def>G</def>
        <def>H</def>
        <def>I</def>
    </abc>
</root>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top