2013-03-14 4 views
0

Я читал обо всем, что я могу найти, и не нашел способа заставить это работать. Я пытаюсь запросить сумму из определенных узлов на основе значений узла или его родителя. Некоторые из узлов могут отвечать основным требованиям наличия собственного имени, но их родитель может не так, поэтому мне нужно их игнорировать. В SQL-терминах я бы приблизился к этому с помощью предложения EXISTS или LIKE.XPath, фильтр на основе связанных узлов в

То, что я пытаюсь сделать, это

SUM ServiceAmounts 
    FROM ChargeData elements 
    WHERE ChargeDescription = 'subTotal-DistrubutionCharges' 
      AND Detail.ServiceType = 'electric' 
      AND NOT 
      (
       ChargeData has a sibling with ChargeDescription = 'Leased Outdoor Lighting' - the entire detail node should be ignored that contains the ChargeData element with 'Leased Outdoor Lighting'. 
     ) 

Моя XSL версия 1.0, если это ценность.

Источник XML:

<Source> 
     <Detail> 
     <ServiceType>electric</ServiceType> 
     <Charges> 
      <ChargeData> 
      <AllowanceChargeInd>C</AllowanceChargeInd> 
      <ServiceAmount>19.8</ServiceAmount> 
      <ChargeDescription>7% Sales Tax</ChargeDescription> 
      <ChargeID>sales_tax</ChargeID> 
      </ChargeData> 
      <ChargeData> 
      <AllowanceChargeInd>C</AllowanceChargeInd> 
      <ServiceAmount>282.8</ServiceAmount> 
      <ChargeDescription>E-2 Demand</ChargeDescription> 
      <ChargeID>usage_charge</ChargeID> 
      </ChargeData> 
      <ChargeData> 
      <AllowanceChargeInd>C</AllowanceChargeInd> 
      <ServiceAmount>165.91</ServiceAmount> 
      <ChargeDescription>7% Sales Tax</ChargeDescription> 
      <ChargeID>sales_tax</ChargeID> 
      </ChargeData> 
      <ChargeData> 
      <AllowanceChargeInd>C</AllowanceChargeInd> 
      <ServiceAmount>2370.15</ServiceAmount> 
      <ChargeDescription>E-2 Commercial</ChargeDescription> 
      <ChargeID>usage_charge</ChargeID> 
      </ChargeData> 
      <ChargeData> 
      <AllowanceChargeInd>C</AllowanceChargeInd> 
      <ServiceAmount>2838.66</ServiceAmount> 
      <Quantity>0</Quantity> 
      <ChargeDescription>subTotal-DistributionCharges</ChargeDescription> 
      </ChargeData> 
     </Charges> 
     </Detail> 
     <Detail> 
     <ServiceType>electric</ServiceType> 
     <Charges> 
      <ChargeData> 
      <AllowanceChargeInd>C</AllowanceChargeInd> 
      <ServiceAmount>2.57</ServiceAmount> 
      <ChargeDescription>7% Sales Tax</ChargeDescription> 
      <ChargeID>sales_tax</ChargeID> 
      </ChargeData> 
      <ChargeData> 
      <AllowanceChargeInd>C</AllowanceChargeInd> 
      <ServiceAmount>36.8</ServiceAmount> 
      <ChargeDescription>Leased Outdoor Lighting</ChargeDescription> 
      <ChargeID>usage_charge</ChargeID> 
      </ChargeData> 
      <ChargeData> 
      <AllowanceChargeInd>C</AllowanceChargeInd> 
      <ServiceAmount>39.37</ServiceAmount> 
      <Quantity>0</Quantity> 
      <ChargeDescription>subTotal-DistributionCharges</ChargeDescription> 
      </ChargeData> 
     </Charges> 
     </Detail> 
    </Source> 

Мой XSL, ну я попробовал несколько и держать удар в тупик:

sum(//ChargeData[not(contains(ChargeDescription,'Leased Outdoor Lighting')) 
    and not(contains(Detail/Charges/ChargeData/ChargeDescription, 'subTotal')) 
    and ancestor::Detail/ServiceType='electric']/ServiceAmount) 

или

sum(//ChargeData[contains(ChargeDescription, 'subTotal-DistributionCharges') 
    and ancestor::Detail/ServiceType='electric']/ServiceAmount) 
    - 
    sum(//ChargeData[contains(ChargeDescription, 'Leased Outdoor Lighting') 
    and ancestor::Detail/ServiceType='electric']/ServiceAmount) 

Может быть, это ISN» возможно. Единственное, что я не могу сделать, это изменить структуру схемы/данных.

ответ

0

Я немного смущен вашими требованиями и ваш образец имеет несовпадающие метки (<Source></Bill>)

Это выбирает один элемент ChargeData в вашем образце, который я думаю соответствует вашим критериям

Detail 
[ServiceType="electric"] 
[not(Charges/ChargeData/ChargeDescription[.="Leased Outdoor Lighting"])] 
/Charges/ChargeData[ChargeDescription="subTotal-DistributionCharges"] 

Объяснение

  • Detail
    Выберите Detail дочерних элементов
  • [ServiceType="electric"]
    Выберите только Detail элементы с ребенком ServiceType элементом со значением «электрических»
  • [not(Charges/ChargeData/ChargeDescription[.="Leased Outdoor Lighting"])]
    Исключить Detail элементов, где есть потомок ChargeDescription согласования исключение строка при условии
  • /Charges/ChargeData[ChargeDescription="subTotal-DistributionCharges"]
    Под фильтрованными Детальными элементами выберите ChargeData, где есть дочерняя строка. Зарядка, соответствующая заданной строке.

Так

sum(
Detail 
[ServiceType="electric"] 
[not(Charges/ChargeData/ChargeDescription[.="Leased Outdoor Lighting"])] 
/Charges/ChargeData[ChargeDescription="subTotal-DistributionCharges"]/ServiceAmount 
) 

Урожайность

2838.6599999999999 
+0

Спасибо за ответ Мэтта. Я исправил XML, сожалею об этом закрывающем теге. Я пробовал ваше решение в XML Spy, и ему это не нравится. Пытался настроить его и не смог туда добраться, но в VS2010 это бинго. Когда-нибудь я смогу обойти этот синтаксис. Спасибо огромное! – Rick

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