简体   繁体   English

在 xslt 1.0 的 for-each 循环中添加多个节点

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM