سؤال

<xsl:for-each select="./node [position() &lt;= (count(*) div 2)]">
    <li>foo</li>
</xsl:for-each>
<xsl:for-each select="./node [count(*) div 2 &lt; position()]">
    <li>bar</li>
</xsl:for-each>

قائمتي 12 العقد ، ولكن القائمة الثانية دائما 8 و الأول هو دائما 4.ما هو الخطأ في بلدي يختار?

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

المحلول

عندما تفعل count(*), العقدة الحالية هو node عنصر معالجتها.تريد إما count(current()/node) أو last() (الأفضل) ، أو مجرد حساب الوسط إلى متغير للحصول على أداء أفضل و أوضح رمز:

<xsl:variable name="nodes" select="node"/>
<xsl:variable name="mid" select="count($nodes) div 2"/>
<xsl:for-each select="$nodes[position() &lt;= $mid]">
  <li>foo</li>
</xsl:for-each>
<xsl:for-each select="$nodes[$mid &lt; position()]">
  <li>bar</li>
</xsl:for-each>

نصائح أخرى

يمكنك محاولة استخدام last() وظيفة والتي سوف تعطيك حجم السياق الحالي:

<xsl:for-each select="./node [position() &lt;= last() div 2]">
   <li>foo</li>
</xsl:for-each>
<xsl:for-each select="./node [last() div 2 &lt; position()]">
   <li>bar</li>
</xsl:for-each>

لست متأكد لكن يبدو لي أن count(*) لا تفعل ما كنت أعتقد أنه هو.أن تحصي عدد الأطفال العقدة الحالية ، وليس حجم العقدة الحالية قائمة.يمكنك طباعته للتحقق من أن 8 أو 9 بدلا من 12 سنة ؟

استخدام last() للحصول على سياق الحجم.

حاول عدد(../عقدة).وفيما يلي سوف يعطي النتيجة الصحيحة في الامتحان ملف XML (بسيط العقد الجذرية مع عناصر عقدة) باستخدام xsltproc XSLT المعالج.

<xsl:for-each select="node[position() &lt;= (count(../node) div 2)]">
    ...
</xsl:for-each>
<xsl:for-each select="node[(count(../node) div 2) &lt; position()]">
    ...
</xsl:for-each>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top