e-h*_*der 19 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>
Run Code Online (Sandbox Code Playgroud)
我正在尝试定义一个变量,以查看Alive/Dead级别中有多少属性具有模板参数中定义的长值(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>
Run Code Online (Sandbox Code Playgroud)
可以在"ID"级别定义多个Property元素.但我相当确定我可以指望"ID"下只有一个Property元素("Value"),而"Value"下只有一个"long"元素.
[免责声明]无论是谁设计了整个XML文件我都坚持使用REALLY不知道如何构建XML(例如,向后使用属性与元素).我担心我的XSLT思维会暂时被扭曲:)结果.[/放弃]
Cer*_*rus 40
这个XPath:
count(//Property[long = '11007'])
Run Code Online (Sandbox Code Playgroud)
返回相同的值:
count(//Property/long[text() = '11007'])
Run Code Online (Sandbox Code Playgroud)
...除了第一个计算Property
与标准匹配的节点,第二个计算long
与标准匹配的子节点.
根据您的评论并多次阅读您的问题,我相信您希望根据标准组合找到唯一性.因此,实际上,我认为你实际上正在检查多个条件.以下也适用:
count(//Property[@Name = 'Alive'][long = '11007'])
Run Code Online (Sandbox Code Playgroud)
因为它意味着同样的事情:
count(//Property[@Name = 'Alive' and long = '11007'])
Run Code Online (Sandbox Code Playgroud)
当然,您可以替换模板中参数的值.上面的代码只说明了这一点.
编辑(问题编辑后)
你对XML非常糟糕是对的.事实上,这是一个彻头彻尾的CodingHorror候选人!我不得不继续叙述我现在所处的"属性"节点.我感觉到你的痛苦!
干得好:
count(/root/ac/Properties/Property[Properties/Property/Properties/Property/long = $parPropId])
Run Code Online (Sandbox Code Playgroud)
请注意,我已删除所有其他检查(ID和值).它们似乎不是必需的,因为您可以使用XML中的层次结构到达相关节点.此外,您已经提到,检查唯一性仅基于long
元素的内容.