XSL Умножение значения умноженное на значение выбора - PullRequest
0 голосов
/ 29 июня 2018

У меня есть этот кусок кода:

<xsl:value-of 
select="sum(objects/object/items/item[not(product_type='configurable' and 
count(custom_options/custom_option[option_id='2686']) &gt; 
0)]/custom_options/custom_option[option_id='2686']/value)" />

, который правильно выводит целое число, которое я хочу, но теперь в другом поле, я хочу умножить это на значение, в моем случае, qty_ordered. Итак, что я попробовал, это:

<xsl:value-of 
select="sum(objects/object/items/item[not(product_type='configurable' and 
count(custom_options/custom_option[option_id='2686']) &gt; 
0)]/custom_options/custom_option[option_id='2686']/value * qty_ordered)" />

К сожалению, это не работает, и я понятия не имею, как это сделать. Кто-нибудь сможет помочь мне создать строку кода, которая выдает id2686/value * qty_ordered? qty_ordered также находится в цикле предметов / предметов.

Это ввод:

<items>
<item>
<qty_ordered>5.0000</qty_ordered>

и

<custom_option>
<name>Aantal pagina's in PDF</name>
<value>1</value>
<sku/>
<option_id>2686</option_id>
</custom_option>

1 Ответ

0 голосов
/ 29 июня 2018

В XSLT 1.0 есть несколько способов сделать это. Один из способов - создать временное дерево результатов, содержащее отдельные значения qty_ordered и value для каждого элемента, например:

<xsl:variable name="items">
  <xsl:for-each select="item[not(product_type='configurable')]">
    <item>
      <xsl:value-of select="qty_ordered * custom_options/custom_option/value" />
    </item>
  </xsl:for-each>
</xsl:variable>

Однако в XSLT 1.0 вам потребуется использовать функцию расширения для доступа к узлам в переменной (поскольку переменная items имеет тип «фрагмент дерева результатов» и должна быть преобразована в набор узлов). для использования с функцией суммы). Наиболее распространенным из них является exslt.

Попробуйте это XSLT (я упростил выражение xpath для краткости)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exslt="http://exslt.org/common"
                exclude-result-prefixes="exslt"
                version="1.0">

  <xsl:output method="xml" indent="yes" />

  <xsl:template match="items">
    <xsl:variable name="items">
      <xsl:for-each select="item[not(product_type='configurable')]">
        <item>
          <xsl:value-of select="qty_ordered * custom_options/custom_option/value" />
        </item>
      </xsl:for-each>
    </xsl:variable>

    <result>
      <xsl:value-of select="sum(exslt:node-set($items)/item)" />
    </result>
  </xsl:template>
</xsl:stylesheet>

Когда вы применяете его к этому XML

<items>
   <item>
      <qty_ordered>5.0000</qty_ordered>
      <custom_options>
         <custom_option>
            <name>Aantal pagina's in PDF</name>
            <value>1</value>
            <sku/>
            <option_id>2686</option_id>
         </custom_option>
      </custom_options>
   </item>
   <item>
      <qty_ordered>2.0000</qty_ordered>
      <custom_options>
         <custom_option>
            <name>Aantal pagina's in PDF - Vol 2</name>
            <value>3</value>
            <sku/>
            <option_id>2687</option_id>
         </custom_option>
      </custom_options>
   </item>
</items>

Результат такой ...

<result>11</result>

РЕДАКТИРОВАТЬ: Немного сложно объяснить, как интегрировать это в существующий код, потому что вы недостаточно показали свой существующий XSLT

Но где ты сейчас это делаешь ...

 <xsl:value-of 
select="sum(objects/object/items/item[not(product_type='configurable' and 
count(custom_options/custom_option[option_id='2686']) &gt; 
0)]/custom_options/custom_option[option_id='2686']/value)" />

Вы, вероятно, хотите изменить это на это ...

<xsl:variable name="items">
  <xsl:for-each select="objects/object/items/item[not(product_type='configurable' and count(custom_options/custom_option[option_id='2686']) &gt; 0)]">
    <item>
      <xsl:value-of select="qty_ordered * custom_options/custom_option[option_id='2686']/value" />
    </item>
  </xsl:for-each>
</xsl:variable>
<xsl:value-of select="sum(exslt:node-set($items)/item)" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...