XSLT将函数应用于元素值,并在xml文档的新副本中输出结果

时间:2018-01-09 12:33:04

标签: function xslt

如何将函数应用于元素值并输出结果

这是我的来源

<tests>
  <test>
    <row name="C/A">-0.1</row>
    <row name="C/B">-0.2</row>
    <row name="C/C">Text1</row>
  </test>
  <test>
    <row name="C/A">1.1</row>
    <row name="C/B">2.2</row>
    <row name="C/C">Text2</row>
  </test>
</tests>

样式表

<?xml version="1.0" encoding="UTF-8"?>
<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="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="test/row[@name='C/A'] | test/row[@name='C/B']">
    <xsl:copy>
      <xsl:value-of select=". * 1000"/>
    </xsl:copy>    
  </xsl:template>

</xsl:stylesheet>

我想在具有属性&#34; C / A&#34;的行上调用函数。和&#34; C / B&#34;。 在我的示例样式表中,我乘以1000(但是我想应用更复杂的公式)。

这是理想的结果

<tests>
  <test>
    <row name="C/A">-100</row>
    <row name="C/B">-200</row>
    <row name="C/C">Text</row>
  </test>
  <test>
    <row name="C/A">1100</row>
    <row name="C/B">2200</row>
    <row name="C/C">Text</row>
  </test>
 </tests>

这是我的输出,name属性未被复制。另外,我如何对行值进行函数并返回结果。例如,乘数可能取决于&#39;行&#39;值

<?xml version="1.0" encoding="UTF-8"?>
<tests>
  <test>
    <row>-100</row>
    <row>-200</row>
    <row name="C/C">Text1</row>
  </test>
  <test>
    <row>1100</row>
    <row>2200</row>
    <row name="C/C">Text2</row>
  </test>
</tests>

感谢您的时间

1 个答案:

答案 0 :(得分:2)

要复制属性,只需添加一行以将其选择为模板

<xsl:template match="test/row[@name='C/A'] | test/row[@name='C/B']">
  <xsl:copy>
    <xsl:apply-templates select="@*" />
    <xsl:value-of select=". * 1000"/>
  </xsl:copy>    
</xsl:template>

在应用函数方面,请考虑使用命名模板...

<xsl:template match="test/row[@name='C/A'] | test/row[@name='C/B']">
  <xsl:copy>
    <xsl:apply-templates select="@*" />
    <xsl:call-template name="myFunction" />
  </xsl:copy>    
</xsl:template>

<xsl:template name="myFunction">
  <xsl:param name="value" select="." />
  <xsl:value-of select="$value * 1000"/>
</xsl:template>

这使用当前节点的值作为默认值,但如果需要,您可以传入不同的参数值。