计算一个值来的次数?

时间:2012-03-01 13:24:06

标签: xml xslt

我有一个xml文件和相应的xsl文件。我有一个以下代码行,在代码中重复了很多次。我需要找出状态值为0的次数?我怎么能这样做?

提前致谢

3 个答案:

答案 0 :(得分:2)

使用xpath count(//UserValue[@title = 'status' and @value = 0])

答案 1 :(得分:2)

输入XML:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <child1>
    <UserValue type="int" value="0" title="status"></UserValue>
    <UserValue type="int" value="0" title="status"></UserValue>
    <UserValue type="int" value="0" title="status"></UserValue>
    <UserValue type="int" value="0" title="status"></UserValue>
    <UserValue type="int" value="0" title="status"></UserValue>
    <UserValue type="int" value="0" title="status"></UserValue>
    <UserValue type="int" value="0" title="statusss"></UserValue>
  </child1>
  <child2>
    <UserValue type="int" value="0" title="status"></UserValue>
    <UserValue type="int" value="0" title="status"></UserValue>
    <UserValue type="int" value="0" title="status"></UserValue>
    <UserValue type="int" value="0" title="status"></UserValue>
    <UserValue type="int" value="0" title="status"></UserValue>
    <UserValue type="int" value="0" title="status"></UserValue>
    <UserValue type="int" value="0" title="status"></UserValue>
  </child2>
</root>

这将计算整个文件中UserValue个节点的数量,这些节点具有属性Value='0'和属性title='status'

 <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns="http://www.plmxml.org/Schemas/PLMXMLSchema">
  <xsl:output method="xml" indent="yes"/>

  <xsl:variable name="count_nodes" select="count(//ns:UserValue[@value='0' and @title='status'])"/>

  <xsl:template match="/">
    <xsl:element name="count">
      <xsl:value-of select="$count_nodes"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

输出:

<?xml version="1.0" encoding="utf-8"?>
<Count>2</Count>
  

根据Dimitre对绩效差异的评论进行编辑:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns="http://www.plmxml.org/Schemas/PLMXMLSchema">
  <xsl:output method="xml" indent="yes"/>

  <xsl:variable name="count_nodes" select="count(/*/*/ns:UserData/ns:UserValue[@title = 'status' and @value= '0'])"/>

  <xsl:template match="/">
    <xsl:element name="count">
      <xsl:value-of select="$count_nodes"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

答案 2 :(得分:1)

XML文档位于默认命名空间

因此,解决方案必须考虑到这一点:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="http://www.plmxml.org/Schemas/PLMXMLSchema">
 <xsl:output method="text"/>


 <xsl:template match="/">
     <xsl:value-of select="count(//x:UserValue[@title = 'status' and @value= '0'])"/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档

评估指定节点计数的XPath表达式,并输出此计数

2

请注意:使用//伪运算符的XPath表达式可能非常慢,因此如果XML文档的结构众所周知,则应使用等效的XPath表达式不包含//

例如,如果我已正确理解所提供文档的结构,那么这是一个更好的XPath表达式:

count(/*/*/x:UserData/x:UserValue[@title = 'status' and @value= '0'])