复制现有的XML,复制元素并进行修改

时间:2010-06-15 12:19:41

标签: xml xslt

目前我有一个棘手的XSL问题。 我需要复制现有的XML,复制某个元素(加上它的子元素)并修改两个子元素的值。 修改是:将'value'元素的值除以110,并将'type'元素的值从'normal'编辑为'discount'。

这是我目前所拥有的:

当前XML:

<dataset>
  <data>
   <prices>
    <price>
      <value>50.00</value>
      <type>normal</type>
    </price>
  </prices>
 </data>
</dataset>

预期结果

<dataset>
  <data>
   <prices>
    <price>
      <value>50.00</value>
      <type>normal</type>
    </price>
    <price>
      <value>45.00</value>
      <type>discount</type>
    </price>
  </prices>
 </data>
</dataset>

任何接受者? 我已经使用copy-of复制了所需的'price'元素,但是我不知道如何修改它。

2 个答案:

答案 0 :(得分:1)

您的规格有点偏差 - 您的值是乘以.9而不是除以110的结果。以下假设您想要以“正常”价格编辑所有内容 - 更改模板匹配模式特定节点或节点集。

<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml"/>

  <xsl:template match="/dataset/data/prices/price[type='normal']">
    <xsl:apply-templates/>
    <xsl:copy>
      <value><xsl:value-of select="format-number(value * 0.9, '0.00')"/></value>
      <type>discount</type>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

假设您有一个与价格匹配的模板,您只需要添加您正在谈论的逻辑:

<xsl:template match="price">
  <!-- xsl:copy or xsl:copy-of depending on how you did it -->
  <xsl:copy>
    <xsl:apply-templates/>
  </xsl:copy>
  <price>
    <value>
      <xsl:value-of select="value * 0.9"/>
    </value>
    <type>discount</type>
  </price>
</xsl:template>

我猜你的操作实际上是“乘以.9”而不是“除以110”,因为45不等于50除以110(也不是45等于50除以1.10)。