首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >具有给定值的XSLT计数元素

具有给定值的XSLT计数元素
EN

Stack Overflow用户
提问于 2009-04-06 15:24:35
回答 3查看 114.2K关注 0票数 23

我需要计算XML文件中具有特定值的元素的数量(以验证唯一性)。XML文件如下所示:

XML :XML用一些人设计的乱七八糟的东西更新了原始的“简化的”。不幸的是,除非经过编辑,否则这将使之前所有的答案变得非常混乱和错误。

代码语言:javascript
复制
<root>
  <ac>
   <Properties>
     <Property Name="Alive">
      <Properties>
        <Property Name="ID">
         <Properties>
           <Property Name="Value">
            <long>11007</long>
           </Property>
         </Properties>
        </Property>
      </Properties>
     </Property>
     <Property Name="Dead">
      <Properties>
        <Property Name="ID">
         <Properties>
           <Property Name="Value">
            <long>11008</long>
           </Property>
         </Properties>
        </Property>
      </Properties>
     </Property>
     ...
     <Property Name="MostlyDeadAllDay">
      <Properties>
        <Property Name="ID">
         <Properties>
           <Property Name="Value">
            <long>99001</long>
           </Property>
         </Properties>
        </Property>
      </Properties>
     </Property>
   </Properties>
  </ac>
</root>

我正在尝试定义一个变量,以查看在模板参数中定义的Alive/Dead级别的属性中有多少具有长值(ID)。一些类似的东西(尽管我怀疑这是错误的)。

代码语言:javascript
复制
<xsl:param name="parPropId"/>
<xsl:variable name="countProperties">
   <xsl:value-of select="count(/root/ac/
      Properties/Property/
      Properties/Property[@Name = 'ID']/
      Properites/Property[@Name = 'Value']/long = $parPropId)"/>
</xsl:variable>

可以在"ID“级别定义多个属性元素。但我相当确定我可以在"ID“下只有一个属性元素( "Value”),在“Value”下只有一个"long“元素。

免责声明无论是谁设计了我一直在使用的整个XML文件,他真的不知道如何构造XML (例如,反向使用属性而不是元素)。我担心我的XSLT思维暂时被扭曲了:)结果是。/disclaimer

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-04-06 16:29:54

此XPath:

代码语言:javascript
复制
count(//Property[long = '11007'])

返回与以下内容相同的值:

代码语言:javascript
复制
count(//Property/long[text() = '11007'])

第一个计算匹配条件的Property节点,第二个计算匹配条件的long子节点的...except。

根据你的评论和几次阅读你的问题,我相信你想要找到基于组合标准的唯一性。因此,实际上,我认为您实际上是在检查多个条件。以下方法也适用:

代码语言:javascript
复制
count(//Property[@Name = 'Alive'][long = '11007'])

因为它的意思是一样的:

代码语言:javascript
复制
count(//Property[@Name = 'Alive' and long = '11007'])

当然,您可以用这些值替换模板中的参数。上面的代码只是说明了这一点。

编辑(编辑问题后)

关于XML很可怕的说法,您说得很对。事实上,这是一个彻头彻尾的CodingHorror候选!我不得不不断地重新计算,以跟踪我目前所在的"Property“节点。我能感受到你的痛苦!

这就是了:

代码语言:javascript
复制
count(/root/ac/Properties/Property[Properties/Property/Properties/Property/long = $parPropId])

请注意,我已经删除了所有其他检查(针对ID和值)。它们似乎不是必需的,因为您可以使用XML中的层次结构到达相关节点。此外,您已经提到,唯一性检查仅基于long元素的内容。

票数 43
EN

Stack Overflow用户

发布于 2009-04-06 15:30:13

您的xpath只是有点不对劲:

代码语言:javascript
复制
count(//Property/long[text()=$parPropId])

编辑: Cerebrus非常正确地指出,您的OP中的代码(使用节点的隐式值)绝对适合您的目的。实际上,由于您很可能希望使用"Property“节点而不是"long”节点,因此请求//Property[long=$parPropId]可能比使用text() xpath更好,尽管您可以从可读性的角度考虑使用后者。

我能说什么呢,我今天有点累:)

票数 2
EN

Stack Overflow用户

发布于 2009-04-06 15:28:22

代码语言:javascript
复制
<xsl:variable name="count" select="count(/Property/long = $parPropId)"/>

未经测试,但我认为这应该是可行的。我假设属性节点是根节点的直接子节点,因此去掉了用于性能的后代选择器

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/721963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档