2

我有这两个 xml,并且我希望通过从给定的两个输入中对它们求和来获得最终 xml 中的属性总和。在下面的示例中解释

<?xml version="1.0" encoding="UTF-8"?>
<chart xmlns="http://www.xyz.in/server/model" labelStep="1" showValues="0">
   <categories>
      <category Label="Bangalore Technical RATH" />
   </categories>
   <dataset>
      <set value="3" anchorRadius="2" anchorBorderThickness="3" />
      <set value="3" anchorRadius="2" anchorBorderThickness="3" />
   </dataset>
</chart>

类似的是第二个 input2.xml

<?xml version="1.0" encoding="UTF-8"?>
<chart xmlns="http://www.xyz.in/server/model" labelStep="1" showValues="0">
   <categories>
      <category Label="Bangalore Technical RATH" />
   </categories>
   <dataset>
      <set value="2" anchorRadius="2" anchorBorderThickness="3" />
      <set value="1" anchorRadius="2" anchorBorderThickness="3" />
   </dataset>
</chart>

我用于 xsl-ttransformation 的代码是

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
   <xsl:output method="xml" indent="yes" />
   <xsl:variable name="second" select="document('file2.xml')//*[local-name()='set']" />
   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()" />
      </xsl:copy>
   </xsl:template>
   <xsl:template match="*[local-name()='set']/@*[local-name()='value']">
      <xsl:for-each select="//*[local-name()='set']">
         <xsl:variable name="secondvalue" select="$second/@value" />
         <xsl:attribute name="value">
            <xsl:value-of select="@*[local-name()='value']  + $secondvalue[1]" />
         </xsl:attribute>
      </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>

所以在最终的 output.xml 中我只需要显示感兴趣的部分

<dataset>
       <set value="5" anchorRadius="2" anchorBorderThickness="3"/>
       <set value="4" anchorRadius="2" anchorBorderThickness="3"/>
</dataset>
4

2 回答 2

1

这个怎么样:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://www.xyz.in/server/model" version="1.0">
   <xsl:output method="xml" indent="yes" />
   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()" />
      </xsl:copy>
   </xsl:template>
   <xsl:template match="my:dataset">
      <xsl:copy>
         <xsl:for-each select="my:set">
            <xsl:variable name="position" select="position()" />
            <xsl:copy>
               <xsl:apply-templates select="@*" />
               <xsl:attribute name="value">
                  <xsl:value-of select="number(@value) + number(document('source2.xml')/my:chart/my:dataset/my:set[$position]/@value)" />
               </xsl:attribute>
            </xsl:copy>
         </xsl:for-each>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>
于 2013-11-07T20:35:50.147 回答
0

尝试在缓存中设置总和,稍后在解析结果查询时,您可以使用此缓存来放置其他 2 个 xml 的值的总和。您也可以为其设置配置文件属性。

于 2013-11-07T19:40:16.290 回答