Скопируйте существующий XML, дублируйте элемент и измените - PullRequest
0 голосов
/ 15 июня 2010

У меня сейчас сложная проблема с 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>

Любой берущий? Я дошел до того, что скопировал нужный элемент 'price' с использованием copy-of, но я застрял в том, как его изменить следующим образом.

Ответы [ 2 ]

1 голос
/ 15 июня 2010

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

Если у вас есть шаблон, который соответствует цене, вам просто нужно добавить логику, о которой вы говорите:

<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 (и 45 не равно 50, деленному на 1,10).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...