سؤال

أنا عالق مع مشكلة تبدو غبية ولكن لا يمكنني معرفة الحل ... مع XLST، أحتاج إلى مبلغ قائمة القيم المحسوبة بواسطة قالب. لذلك قمت بتخزين هذه القيم في هيكل الأشجار (قائمة بعناصر "عدد" الموجودة في عنصر جذر "أرقام"). ولكن أيا كان ما أحاول القيام به مع هذه القائمة ذاتي، سيعود أي شيء أو 0 أو خطأ ...

هل يعرف شخص ما ما أفعله خطأ؟

<!-- create the tree fragment -->
<xsl:variable name="_subTotals">
    <Numbers>
        <xsl:for-each select="List">
            <xsl:variable name="_Size">
                <xsl:call-template name="GetSize">
                    <xsl:with-param name="_value" select="@value"/>
                </xsl:call-template>
            </xsl:variable>
            <Number>
                <xsl:value-of select="$_Size"/>
            </Number>
        </xsl:for-each>
    </Numbers>
</xsl:variable>

<!-- this returns an error: expression must result into a node-set -->
<xsl:message terminate="no">
    <xsl:value-of select="sum($_subTotals/Numbers/Number)"/>
</xsl:message>

<!-- transform the tree fragment into a node-set
<xsl:variable name="_Total" select="msxsl:node-set($_subTotals)"/>

<!-- returns nothing -->
<xsl:for-each select="$_Total/Numbers/Number">
    <xsl:message terminate="no">
        <xsl:value-of select="@value"/>
    </xsl:message>
</xsl:for-each>

<!-- returns 0 -->
<xsl:value-of select="sum($_Total/Numbers/Number)"/>
هل كانت مفيدة؟

المحلول

إليك طريقة سريعة كيفية مجموع القيم التي تم إنشاؤها ديناميكيا (ربما لا ينتج القالب الذي تتصل به النتائج المتوقعة؟ إذا كان الأمر كذلك، فيجب عليك أن تطلب سؤالا آخر وتوفر كل من التعليمات البرمجية وثيقة XML التي تعمل عليها التعليمات البرمجية. بدون هذه لا أحد يستطيع المساعدة والأمشيش لن يكون مفيدا. ):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
 >
 <xsl:output method="text"/>

    <xsl:template match="/">
      <xsl:variable name="vrtfNums">
         <nums>
           <num>1</num>
           <num>2</num>
         </nums>
      </xsl:variable>

      <xsl:variable name="vNums" select="ext:node-set($vrtfNums)"/>

      <xsl:value-of select="sum($vNums/*/*)"/>
    </xsl:template>
</xsl:stylesheet>

عند تطبيق التحول أعلاه على أي مستند XML (تم تجاهله)، يتم إنتاج النتيجة المطلوبة:

3

نصائح أخرى

العودية هي الجواب المعتاد في اللغات الوظيفية. شيء مثل:

<xsl:template name='totalRest>
  <xsl:variable nane='sub'>
    <!-- Use for-each to set local new context node -->
    <xsl:for-each select='following::List[1]'>
      <xsl:call-template name='totalRest'/>
    </xsl:for-each>
  </xsl:variable>
  <xsl:variable name='this'>
    <xsl:call-template name="GetSize">
      <xsl:with-param name="_value" select="@value"/>
    </xsl:call-template>
  </xsl:variable>

  <xsl:value-of select='$sub+$this' />

</xsl:template>

دون معرفة المزيد من التجاوز وثيقة الإدخال من الصعب أن تكون أكثر تحديدا حول XPath الأيمن لتعيين عقدة السياق للمكالمة المتكررة.

في حالتي كان لدي نفس المشكلة بالضبط مجموع ($ شيء / عنصر) عاد 0 و مجموع ($ شيء / *) عاد القيمة الصحيحة.

كانت مشكلتي ناجمة عن إعلان UBL الفاتورة UBL التالي:

XMLNS = "URN: OASIS: الأسماء: المواصفات: UBL: Schema: XSD: Invoice-2"

بعد إزالة هذا الخط، مجموع ($ شيء / عنصر) عاد القيمة الصحيحة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top