首页 > 解决方案 > XSL将一个值乘以选择值中的一个值

问题描述

我有这段代码:

<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_orderedqty_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>

标签: xmlxslt

解决方案


在 XSLT 1.0 中,有几种方法可以做到这一点。一种方法是创建一个临时结果树,其中包含每个项目的各个值qty_orderedvalue如下所示:

<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变量属于“结果树片段”类型,并且需要转换为节点集以与 sum 函数一起使用)。最常用的是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)" />

推荐阅读