Xml 更改单个节点';使用XSL复制元素中的内容,同时复制其余内容

Xml 更改单个节点';使用XSL复制元素中的内容,同时复制其余内容,xml,xslt,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&

我有一些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>

0
0
年初至今和利息字段的操作与我预期的一样,基本上是将少量金额舍入为零。问题在于“否则”条款;我似乎误解了如何使用这本书。我希望将报表元素的其他n个属性复制到原始XML中。问题在于,对于一个ytd非常小的报表,当前模板的输出如下所示:

<Report><ytd>0</ytd></Report>
0
很明显,我没有正确地复制元素的其余部分。有什么建议吗

编辑: 示例输入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>

上下快速移动
储户
100
0.5
假的
史蒂夫
黄金账户
0.0000000001
0.0000000001
假的
期望的输出是:

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

上下快速移动
储户
100
0.5
假的
史蒂夫
黄金账户
0
0
假的
(显然我只是在模仿,但希望你能明白我的意思)

谢谢,
戴夫。

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

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

0
  • 使用标识规则(请参见上面的第一个模板)按原样复制所有内容
  • 根据需要覆盖图元

考虑向我们展示您想要转换的相关XML输入示例、您想要的输出、您得到的输出和当前代码,以便我们重现问题。到目前为止,您已经展示了一个XSLT片段,其中我们甚至不知道XML输入是什么以及当前上下文节点是什么(谢谢你,伙计!为了获得额外的积分…有没有办法让那些愚蠢的0.000000001看起来更干净一点,也许是用指数表示法?我实际上要找的数字要小得多!不客气。好吧,随你怎么用。你是说像1.0e-9这样的东西吗?是的。问题是我要么是语法错误,要么是遇到了某种问题限制:错误:“ytd[.<1.0e-300]| interest[.<1.0e-300]”中的语法错误。“啊,我现在知道你在问什么了。对不起,我认为你不能做那种检查:)。一个可能的快捷方式可以是
ytd[以(,'0.000')]开头]
,即使这对于任何以0.000开头的数字(例如0.0001)也会通过。