2010-06-15 43 views
0

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

这是目前我有:

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

赞成吗? 我已经得到尽可能复制所需的'价格'元素使用副本,但我坚持以下如何修改它。

回答

1

您的规格有点偏离 - 您的价值是乘以0.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> 
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> 

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