2010-06-15 3 views
0

У меня сейчас сложная проблема XSL. Мне нужно скопировать существующий XML, скопировать определенный элемент (плюс его дочерние элементы) и изменить значение двух дочерних элементов. Модификации: разделите значение элемента «значение» на 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

Ваша спецификация немного завышена - ваше значение является результатом умножения на .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> 

Я предполагаю, что ваша операция на самом деле «умножить на .9» не «разделяй на 110 ", так как 45 не равно 50, деленная на 110 (равно 45, равная 50, деленная на 1.10).

Смежные вопросы