复制其余部分时,使用XSL更改元素中的单个节点内容

时间:2011-06-27 12:58:13

标签: xml xslt

我有一些XML在每个元素中都有相当多的属性,有时我需要格式化一个或两个属性,如果满足某些条件。我以为我会用XSL做这件事。

因此,在我的XSL文件模板中,我有以下内容:

<xsl:choose>
  <xsl:when test="ytd &lt; 0.000000001 or interest &lt; 0.000000001">
    <xsl:element name="Report">
      <xsl:choose>
        <xsl:when test="ytd&lt; 0.000000001">
          <xsl:element name="ytd">0</xsl:element>
        </xsl:when>
        <xsl:when test="interest &lt; 0.000000001">
          <xsl:element name="interest">0</xsl:element>
        </xsl:when>
        <xsl:otherwise>
          <xsl:copy-of select="." />
        </xsl:otherwise>
      </xsl:choose>
    </xsl:element>
  </xsl:when>
  <xsl:otherwise>
    <xsl:copy-of select="." />
  </xsl:otherwise>
</xsl:choose>

YTD和兴趣领域的运作正如我所期望的那样,对我来说基本上将小数量减少到零。问题是否则是条款;我似乎误解了如何使用副本。我希望将Report元素的其他n个属性复制到原始XML中。问题在于这个当前模板我得到的输出如下所示,报告的ytd非常小:

<Report><ytd>0</ytd></Report>

所以显然我并没有正确地复制剩下的元素。有什么指针吗?

编辑: 示例输入XML文件可能是:

<Reports>
  <Report>
    <name>Bob</name>
    <account>Saver</account>
    <ytd>100</ytd>
    <interest>0.5</ytd>
    <cosigned>false</cosigned>
  </Report>
  <Report>
    <name>Steve</name>
    <account>Gold Account</account>
    <ytd>0.0000000001</ytd>
    <interest>0.0000000001</ytd>
    <cosigned>false</cosigned>
  </Report>
</Reports>

期望的输出是:

<Reports>
  <Report>
    <name>Bob</name>
    <account>Saver</account>
    <ytd>100</ytd>
    <interest>0.5</ytd>
    <cosigned>false</cosigned>
  </Report>
  <Report>
    <name>Steve</name>
    <account>Gold Account</account>
    <ytd>0</ytd>
    <interest>0</ytd>
    <cosigned>false</cosigned>
  </Report>
</Reports>

(显然我只是在嘲笑它,但希望你能看出我的意思)

谢谢, 戴夫。

1 个答案:

答案 0 :(得分:6)

我认为做你想做的最简单的方法是:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    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="ytd[ . &lt; 0.000000001 ] | interest[ . &lt; 0.000000001]">
        <xsl:copy>0</xsl:copy>
    </xsl:template>

</xsl:stylesheet>
  • 使用标识规则(请参阅上面的第一个模板)按原样复制所有内容
  • 根据需要覆盖元素