Я читал обо всем, что я могу найти, и не нашел способа заставить это работать. Я пытаюсь запросить сумму из определенных узлов на основе значений узла или его родителя. Некоторые из узлов могут отвечать основным требованиям наличия собственного имени, но их родитель может не так, поэтому мне нужно их игнорировать. В 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» возможно. Единственное, что я не могу сделать, это изменить структуру схемы/данных.
Спасибо за ответ Мэтта. Я исправил XML, сожалею об этом закрывающем теге. Я пробовал ваше решение в XML Spy, и ему это не нравится. Пытался настроить его и не смог туда добраться, но в VS2010 это бинго. Когда-нибудь я смогу обойти этот синтаксис. Спасибо огромное! – Rick