Couting количество раз, когда значение приходит? - PullRequest
0 голосов
/ 01 марта 2012

У меня есть XML-файл и соответствующий XSL-файл.У меня есть следующая строка кода, которая повторяется много раз в коде.Мне нужно найти, сколько раз значение для статуса равно 0?Как я могу это сделать?

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

Входной 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>

отредактировано согласно комментарию Димитра о разнице в производительности:

<?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 голосов
/ 01 марта 2012

Используйте xpath count(//UserValue[@title = 'status' and @value = 0]).

1 голос
/ 01 марта 2012

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'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...