سؤال

كيفية الحصول على عداد داخل xsl:for-each حلقة تعكس عدد العناصر الحالية التي تمت معالجتها.
على سبيل المثال، مصدر XML الخاص بي هو

<books>
    <book>
        <title>The Unbearable Lightness of Being </title>
    </book>
    <book>
        <title>Narcissus and Goldmund</title>
    </book>
    <book>
        <title>Choke</title>
    </book>
</books>

ما أريد الحصول عليه هو:

<newBooks>
    <newBook>
        <countNo>1</countNo>
        <title>The Unbearable Lightness of Being </title>
    </newBook>
    <newBook>
        <countNo>2</countNo>
        <title>Narcissus and Goldmund</title>
    </newBook>
    <newBook>
        <countNo>3</countNo>
        <title>Choke</title>
    </newBook>
</newBooks>

XSLT المراد تعديله:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <newBooks>
            <xsl:for-each select="books/book">
                <newBook>
                    <countNo>???</countNo>
                    <title>
                        <xsl:value-of select="title"/>
                    </title>
                </newBook>
            </xsl:for-each>
        </newBooks>
    </xsl:template>
</xsl:stylesheet>

لذا فإن السؤال هو ماذا نضع بدلا من ؟؟؟.هل هناك أي كلمة رئيسية قياسية أم أنه يجب علي ببساطة الإعلان عن متغير وزيادته داخل الحلقة؟

نظرًا لأن السؤال طويل جدًا، فمن المحتمل أن أتوقع إجابة من سطر واحد أو كلمة واحدة :)

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

المحلول

position().على سبيل المثال:

<countNo><xsl:value-of select="position()" /></countNo>

نصائح أخرى

حاول الإدراج <xsl:number format="1. "/><xsl:value-of select="."/><xsl:text> في مكان ؟؟؟.

لاحظ "1." - هذا هو تنسيق الأرقام.مزيد من المعلومات: هنا

يحاول:

<xsl:value-of select="count(preceding-sibling::*) + 1" />

يحرر - كان هناك تجمد في الدماغ، الموضع() أكثر وضوحًا!

يمكنك أيضًا تشغيل العبارات الشرطية على Postion() والتي يمكن أن تكون مفيدة حقًا في العديد من السيناريوهات.

على سبيل المثال.

 <xsl:if test="(position( )) = 1">
     //Show header only once
    </xsl:if>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <newBooks>
                <xsl:for-each select="books/book">
                        <newBook>
                                <countNo><xsl:value-of select="position()"/></countNo>
                                <title>
                                        <xsl:value-of select="title"/>
                                </title>
                        </newBook>
                </xsl:for-each>
        </newBooks>
    </xsl:template>
</xsl:stylesheet>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top