XPath,基于中的相关节点进行筛选

XPath,基于中的相关节点进行筛选,xpath,Xpath,我已经阅读了所有我能找到的东西,但还没有找到一种方法让它发挥作用。我试图根据节点或其父节点的值查询特定节点的总和。一些节点可能满足具有正确名称的基本要求,但它们的父节点可能不满足,因此我需要忽略这些。在SQL术语中,我将使用EXISTS或LIKE子句来处理这个问题 我想做的是 SUM ServiceAmounts FROM ChargeData elements WHERE ChargeDescription = 'subTotal-DistrubutionCh

我已经阅读了所有我能找到的东西,但还没有找到一种方法让它发挥作用。我试图根据节点或其父节点的值查询特定节点的总和。一些节点可能满足具有正确名称的基本要求,但它们的父节点可能不满足,因此我需要忽略这些。在SQL术语中,我将使用EXISTS或LIKE子句来处理这个问题

我想做的是

   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>


也许这是不可能的。有一件事我不能做,那就是更改模式/数据结构。

我对您的要求有点困惑,您的示例有不匹配的标记(

这将选择样本中我认为符合您标准的单个ChargeData元素

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

  • 详细信息

    选择详图子图元
  • [ServiceType=“electric”]

    仅选择具有值为“electric”的子ServiceType元素的详图元素
  • [非(费用/费用数据/费用说明[.=“租赁室外照明”])]

    如果提供了与排除字符串匹配的子代ChargeDescription,则排除细节元素
  • /Charges/ChargeData[ChargeDescription=“subTotal DistributionCharges”]

    在筛选的详细信息元素下,选择ChargeData,其中提供了子ChargeDescription匹配字符串
所以

屈服

2838.6599999999999

谢谢你的回复,马特。我修正了XML,很抱歉那个结束标记。我在XMLSpy中尝试了您的解决方案,但它不喜欢。试图调整它,但无法达到那里,但在VS2010这是一个宾果游戏。总有一天我可能会对这种语法有所了解。非常感谢你!
Detail
 [ServiceType="electric"]
 [not(Charges/ChargeData/ChargeDescription[.="Leased Outdoor Lighting"])]
 /Charges/ChargeData[ChargeDescription="subTotal-DistributionCharges"]
sum(
 Detail
 [ServiceType="electric"]
 [not(Charges/ChargeData/ChargeDescription[.="Leased Outdoor Lighting"])]
 /Charges/ChargeData[ChargeDescription="subTotal-DistributionCharges"]/ServiceAmount
)
2838.6599999999999