2013-07-25 6 views
4

Мне нужно применить преобразование xsl, которое суммирует определенные значения узлов на основе значения одного из его узлов. Вот мой XML псевдо-код:xsl sum siblings на основе значения узла

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<Message> 
    <Body> 
     <Order> 
      <Item> 
       <.../> 
       <Type>widget</Type> 
       <Qty>20</Qty> 
       <.../> 
      </Item> 
      <Item> 
       <.../> 
       <Type>gadget</Type> 
       <Qty>10</Qty> 
       <.../> 
      </Item> 
      <Item> 
       <.../> 
       <Type>widget</Type> 
       <Qty>5</Qty> 
       <.../> 
      </Item> 
      <Item/> 
     </Order> 
    </Body> 
</Message> 

Нужный результат величины суммирования всех предметов «виджета» типа является 25

<xsl:value-of select="sum(/Message/Body/Order/Item/Qty)"/> 

приносит 35

Мои данные XSL таблицы стилей

xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fn="http://www.w3.org/2005/xpath-functions" 
version="2.0" 

ответ

3

Попробуйте добавить предикаты, чтобы найти интересующие вас узлы (например, «виджет») ly:

<xsl:value-of select="sum(/Message/Body/Order/Item[Type = 'widget']/Qty)"/> 
+0

Спасибо, Fung, похоже, я был как бы преувеличиваю. возможно, это поможет кому-то другому. [введите описание ссылки здесь] [1] [ 1]: http://www.w3schools.com/XPath/xpath_examples.asp – user1555096

+0

@ user1555096 - В зависимости от ваших потребностей вы можете использовать 'not (Type = 'gadget')' вместо 'Type! = 'Gadget «'. Таким образом, вы по-прежнему включаете 'Qty', если' Item' не имеет 'Type'. Также +1 к Fung для хорошего ответа. –

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