[英]add multiple nodes in for-each loop in xslt 1.0
Here is my xml这是我的 xml
<TAG>
<PAYMENT name="delhi"> PAY10 <PAYMENT>
<PAYMENT name="mumbai"> PAY20 <PAYMENT>
<PAYMENT name="singapore"> PAY30 <PAYMENT>
<PAYMENT name="tokyo"> PAY40 <PAYMENT>
<PAYMENT name="new york"> PAY50 <PAYMENT>
<PAYMENT name="london"> PAY60 <PAYMENT>
</TAG>
requirement is to add all the PAYMENT tag value for delhi/mumbai cities.要求是添加德里/孟买城市的所有 PAYMENT 标签值。 eg.
例如。 Expected output = 30 ( 10 + 20 = 30) [ after trimming PAY ]
预期输出 = 30 ( 10 + 20 = 30) [ 调整 PAY 后]
xslt(1.0) : xslt(1.0) :
<xsl:variable name="amt_delhi">
<xsl:if test="contains(.,"TAG/PAYMENT[name='delhi'])">
<xsl:value-of select="substring-after('TAG/PAYMENT[name='delhi')',4)"/>
</xsl:if>
</xsl:variable>
<xsl:variable name="amt_mumbai">
<xsl:if test="contains(.,"TAG/PAYMENT[name='mumbai'])">
<xsl:value-of select="substring-after('TAG/PAYMENT[name='mumbai')',4)"/>
</xsl:if>
</xsl:variable>
<xsl:variable name="total_amt">
<xsl:value-of select="$amt_delhi + $amt_mumbai"/>
</xsl:variable>
<xsl:message><xsl:value-of select="$total_amt"/></xsl:message>
My question is currently I have 100 more such fields and it is difficult to manage xslt whenever new change comes.我的问题是目前我还有 100 个这样的字段,每当有新变化时,很难管理 xslt。 Is there any better way to achieve it?
有没有更好的方法来实现它? (eg. for-each loop) to minimize the number of line of code in xslt.
(例如,for-each 循环)以最小化 xslt 中的代码行数。
How about:怎么样:
XSLT 1.0 (+EXSLT node-set function) XSLT 1.0(+EXSLT 节点集功能)
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/TAG">
<!-- pre-process -->
<xsl:variable name="delhi_mumbai_amounts">
<xsl:for-each select="PAYMENT[@name='delhi' or @name='mumbai']">
<amount>
<xsl:value-of select="substring-after(., 'PAY')"/>
</amount>
</xsl:for-each>
</xsl:variable>
<!-- output -->
<output>
<xsl:value-of select="sum(exsl:node-set($delhi_mumbai_amounts)/amount)"/>
</output>
</xsl:template>
</xsl:stylesheet>
This is assuming there can be more than one occurrence of PAYMENT with the same name.这是假设同名的 PAYMENT 可能不止一次出现。 Otherwise you could do simply:
否则你可以简单地做:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/TAG">
<output>
<xsl:value-of select="substring-after(PAYMENT[@name='delhi'], 'PAY') +substring-after(PAYMENT[@name='mumbai'], 'PAY')"/>
</output>
</xsl:template>
</xsl:stylesheet>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.