подсчитать количество слов в определенном узле xml, используя xsl - PullRequest
1 голос
/ 20 июля 2011

В некоторых случаях мне нужно рассчитать количество слов в определенном узле. Рассмотрим следующий XML-документ.

<root>
<mainNode>     
<book>      
<price> 100 </price>     
<city> chennai </city>    
<list>      
<language> c java ruby </language>    
</list>  
</book> 

<book>     
<price> 200 </price>     
<city> banglore </city>     
<list>           
<language> c java </language>       
</list>     
<list>           
<language> c++ java </language>       
</list>     
<list>
<language> pascal java </language>       
</list>
</book>  

<book>   
<price> 300 </price>    
<city> delhi </city>     
<list>         
<language> java ruby </language>     
</list>   
</book>

</mainNode>
</root>

В приведенном выше документе мне нужно сосчитать количество языков в узле "language".

Вывод как Количество :: 11

Как мне это получить?

1 Ответ

1 голос
/ 20 июля 2011

В вашем примере все языки дополняются пробелами в тексте

<language> c java ruby </language> 

Можете ли вы предположить, что так будет всегда, или вы получите language elements, как так?

<language>c java ruby</language> 

В этом случае объединение всех элементов языка приведет к появлению такой строки, которая показывает семь слов

c java rubyc javac++ javapascal javajava ruby

Чтобы справиться с этой ситуацией, вам, вероятно, потребуется сопоставить элемент языка и вернуть строку, за которой всегда следует пробел.

Попробуйте это XSLT ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:template match="/">
      <xsl:variable name="languagelist">
         <xsl:apply-templates select="//language"/>
      </xsl:variable>
      <!-- Count the number of words by counting the number of spaces -->
      Count:<xsl:value-of select="string-length($languagelist) - string-length(translate($languagelist, ' ', ''))" />
   </xsl:template>

   <!-- Return the normalised string with one space at the end -->
   <xsl:template match="language">
      <xsl:value-of select="concat(normalize-space(.), ' ')" />
   </xsl:template>

</xsl:stylesheet>

Обратите внимание, что метод подсчета количества слов заключается в сравнении длины нормализованной строки (с одиночными пробелами) с длиной строки без пробелов. (т.е. посчитать количество пробелов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...