仅通过XPath计算特定的子项

时间:2012-08-14 14:40:33

标签: xslt xpath

我遇到的情况是,只有当它们为真时我才能找到几个布尔字段值的计数。

输入XML:

<PersonInfo>
  <ArrayOfPersonInfo>
   <CertAsAdultFlag>true</CertAsAdultFlag>
    <DeceasedFlag>true</DeceasedFlag>
    <WantedFlag>false</WantedFlag>
    <CPSORFlag>true</CPSORFlag>
    <ConditonalReleaseFlag>false</ConditonalReleaseFlag>
    <ProbationFlag>true</ProbationFlag>
    <MissingFlag>true</MissingFlag>
    <ATLFlag>true</ATLFlag>
    <CCWFlag>false</CCWFlag>
    <VictimIDTheftFlag>true</VictimIDTheftFlag>
  </ArrayOfPersonInfo>    
</PersonInfo>

如果这些标志是'true',我需要找到这些标志的计数。

以下是我尝试过但未成功的事情:

<xsl:variable name="AlertCount" select="
  count(
    PersonInfo/ArrayOfPersonInfo[
      CPSORFlag[.='true'] | CertAsAdultFlag[.='true'] | 
      DeceasedFlag[.='true'] | WantedFlag[.='true'] | 
      ConditonalReleaseFlag[.='true'] | MissingFlag[.='true'] | 
      ATLFlag[.='true'] | ProbationFlag[.='true'] | CCWFlag[.='true'] | 
      VictimIDTheftFlag[.='true'] | CHRIFlag[.='true'] | 
      CivilWritFlag[.='true'] | MentalPetitionFlag[.='true'] |
      ProtectionOrderFlag[.='true'] | juvWantedFlag[.='true'] | 
      WeaponsFlag[.='true'] | WorkCardFlag[.='true']
    ]
  )
"/> 

我真的需要某人的帮助,因为我一直在努力解决这个问题。提前谢谢。

1 个答案:

答案 0 :(得分:0)

<xsl:variable name="AlertCount" select="count(PersonInfo//*[. = 'true'])" /> 

这就是你的不起作用的原因:

方法中的方括号在节点集上创建谓词。

该节点集是满足其条件的所有提到的子节点的并集。非空节点集的计算结果为true,非{ - 1}}非空表示。

因此,如果任何一个孩子都是真的,那么false总是count(),如果所有孩子都是假的,那么1总是0

换句话说:您选择了一个<ArrayOfPersonInfo>节点。如果它满足条件(任意数量的子项'true'作为其值),则计算它,否则不计算。


在评论中澄清后(“我只需要担心我在上面提到的XML中的标志”):

<xsl:variable name="AlertCount" select="
  count(
    PersonInfo//*[
      self::CPSORFlag or
      self::CertAsAdultFlag or
      self::DeceasedFlag or
      self::WantedFlag or
      self::ConditonalReleaseFlag or
      self::MissingFlag or
      self::ATLFlag or
      self::ProbationFlag or
      self::CCWFlag or
      self::VictimIDTheftFlag or
      self::CHRIFlag or
      self::CivilWritFlag or
      self::MentalPetitionFlag or
      self::ProtectionOrderFlag or
      self::juvWantedFlag or
      self::WeaponsFlag or
      self::WorkCardFlag
    ][. = 'true']
  )
" />