سؤال

وأنا أحاول أن انشاء XSL: IF بيان أن يظهر فقط الإدخالات التي لديها عقدة التي تقع بين قيمتين. بسيطا بما فيه الكفاية، أليس كذلك؟ انها مجرد إذا أكبر من وإذا كانت أقل من. المشكلة هي، بدلا من اختباره ضد عقدة واحدة ولست بحاجة لاختباره ضد ما يصل إلى 52.

ودعونا نقول لدي بعض XML التي تبدو مثل هذا:

<container>
    <entry>
        <item>1</item>
        <item>2</item>
        <item>3</item>
        <item>4</item>
        <item>5</item>
        <item>6</item>
        <item>7</item>
        <item>8</item>
        <item>9</item>
        <item>10</item>
    </entry>
</container>

والآن أقول إنني أعطيت مجموعة من 9-15. لأن بعض العقد تقع في هذا النطاق أريد أن عرض هذا الإدخال. ولكن إذا أعطيت مجموعة من 11-15 أيا من العقد تناسب ذلك لا أريد أن المعروض.

والمشكلة هي ... لا يوجد لدي اي فكرة عن كيفية كنت ستفعل ذلك. وأنا أعلم أنك يمكن IF قيمة واحدة ولكن لا أستطيع التفكير في طريقة بسيطة لاختبار كل عقدة.

وبالمناسبة، هذا هو كل شيء يجري داخل أحدث إصدارة مستقرة من السمفونية CMS.

[عدل] المشكلة مع النتيجتين الأولى هي أنها تكشف عن العقد البند، ما أبحث عنه هو بالعودة العقد المدخل الوحيد التي لديها عقدة البند واحد على الأقل مباريات. أنا لست متأكدا من أي من الحلول من شأنها أن تساعد هذه.

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

المحلول

ويمكنك تحقيق ذلك باستخدام المسند متداخلة على المباريات <entry>:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <xsl:for-each select="container/entry[item[number(.) &gt;= 9 and number(.) &lt;= 15]]">
            <!-- this will loop over <entry>s which contain <item>s within your range -->
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

وقال إن التعبير النحو "إدخالات التي تحتوي على مواد التي تتراوح أعمارهم بين 9 و 15 القيم".

نصائح أخرى

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <xsl:copy-of select="container/entry/item[number(.) &gt;= 9 and number(.) &lt;= 15]"/>
    </xsl:template>
</xsl:stylesheet>

والبيان كسباث 'حاوية / دخول / البند' يشير إلى جميع العناصر المطابقة. المسند [رقم ()> = 9 ورقم (.) <= 15] يقلص تلك القائمة إلى أسفل. بعض العمليات XSLT (على سبيل المثال، XSL: قيمة ل) لديها مرشح ضمني أن الاستيلاء على القيمة الأولى فقط. في هذه الحالات، يمكنك استخدام XSL: مقابل كل من:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <xsl:for-each select="container/entry/item[number(.) &gt;= 9 and number(.) &lt; 15]">
            <xsl:value-of select="."/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

وماذا عن هذا .... يمكنك أن تفعل كل ما تريد داخل مقابل كل حلقة أو يمكنك فقط تأخذ nodeset إرجاعها في متغير واستخدامه في مكان آخر.

   <?xml version='1.0'?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <!-- Your first param -->
        <xsl:param name="Param1" select="4"/>
        <!-- Your second param -->
        <xsl:param name="Param2" select="9"/>
            <xsl:variable name="ResultNodeSet">
                <xsl:for-each select="/container/entry/item[number(.) &gt;= $Param1 and number(.) &lt;= $Param2]">
                  <!-- What ever else you want to do can go here-->
                  <xsl:copy-of select="."/>
                </xsl:for-each>
            </xsl:variable>  
        <xsl:value-of select="$ResultNodeSet"/>
    </xsl:template> 
    </xsl:stylesheet>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top