如何使用xslt添加两个xml中存在的属性

时间:2013-11-07 19:22:56

标签: xml xslt

我有这两个xml,我希望在最终xml中通过将它们与给定的两个输入相加来得到attibutes的总和。在下面的示例中解释

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

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

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