xml - XSL将一个值乘以选择值中的一个值
问题描述
我有这段代码:
<xsl:value-of
select="sum(objects/object/items/item[not(product_type='configurable' and
count(custom_options/custom_option[option_id='2686']) >
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']) >
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>
解决方案
在 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
变量属于“结果树片段”类型,并且需要转换为节点集以与 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']) >
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']) > 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)" />
推荐阅读
- python - 从 Python 中的值列表计算累积分布函数
- kubernetes - Kubernetes EnvoyFilter 描述
- react-native - 如何在导航事件上使用 UseEffect 但在导航道具之外设置参数
- javascript - puppeteer 与测试相结合的问题
- python - 文本检测 Discord.py PRAW
- python-3.x - Python解析XML文件时如何解决Key Error
- django - django Q 过滤器不起作用。(对话匹配查询不存在。)
- java - 如果应用程序中有数千个并发用户,应用程序服务器中执行了多少个 JVM 进程
- php - 循环遍历 php 数组并回显结果
- authentication - 如何使用 JWT 注销