XSLT 计数具有给定值的元素

标签 xslt count elements

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

编辑:我用某人设计的实际毛茸茸的困惑更新了原始的“简化”XML。不幸的是,除非编辑,否则这将使之前的所有答案变得非常困惑和错误。

<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>

我正在尝试定义一个变量,以查看有多少活/死级别的属性具有模板参数中定义的长值 (ID)。沿着这些路线的东西(虽然我怀疑这是错误的)......
<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”级别定义多个 Property 元素。但我相当确定我只能依靠“ID”下的一个 Property 元素(“Value”),而“Value”下只有一个“long”元素。

[免责声明] 设计我一直在使用的整个 XML 文件的人真的不知道如何构建 XML(例如,向后使用属性与元素)。我担心我的 XSLT 想法暂时被扭曲了 :) 结果。 [/免责声明]

最佳答案

这个 XPath:

count(//Property[long = '11007'])

返回与以下相同的值:
count(//Property/long[text() = '11007'])

...除了第一个计数 Property匹配条件和第二个计数的节点 long符合条件的子节点。

根据您的评论并多次阅读您的问题,我相信您希望根据标准组合找到独特性。因此,实际上,我认为您实际上是在检查多个条件。以下也可以工作:
count(//Property[@Name = 'Alive'][long = '11007'])

因为它与以下含义相同:
count(//Property[@Name = 'Alive' and long = '11007'])

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

编辑 (问题编辑后)

你说的很对,XML 太可怕了。其实这是一个彻头彻尾的CodingHorror候选人!我不得不不断地叙述以跟踪我目前所在的“属性”节点。我感觉到你的痛苦!

干得好:
count(/root/ac/Properties/Property[Properties/Property/Properties/Property/long = $parPropId])

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

关于XSLT 计数具有给定值的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/721963/

相关文章:

xml - XML 元素的自定义排序

java - 读取一个文本文件并写入多个文本文件以进行过滤/提取

elements - document.querySelectorAll 一次获取所有选定元素的 innerText 纯 javascript

javascript - 将 javascript 变量传递给 xsl 条件

xml - XSLT:如何生成每行 3 个单元格的 HTML 表格

html - 使用 XSLT 将斜体/粗体格式设置为 HTML

sql - 对于大表,是否有比 "having count"更快的东西?

mysql - SQL 查询没有结果

java - ArrayDeque 添加多个元素

selenium - nightwatch selenium 命令 "elements"返回有关第一个参数的错误,即使我传入了 css 选择器或 xpath 表达式