2012-06-28 3 views
1

При преобразовании этого XML, мне нужно подсчитать количество разрывов строк в этом узле XMLПодсчет количества строк в XSLT

<SpecialInstraction>One 
Two 
Three 
Four 
Five 
Six 
Seven 
Eight 
Nine 
Ten 
Eleven 
twelve 
thirteen 
fourteen 
fifteen</SpecialInstraction> 

Как выше примере есть 14 разрывы строк.

Я попытался определить количество вхождений «&#xD;&#xA;» и «&#13;», но даже если в XML-формате нет изменений, количество вхождений меняется каждый раз, когда этот XML переходит в сериализацию/десериализацию.

У кого-нибудь есть идеи, как я могу получить количество строк от значения узла XML в XSLT?

ответ

0

Был найден аналогичный вопрос на StackOverflow - (count the number of words in a xml node using xsl) для подсчета количества пробелов в строке. Я адаптировал код, немного украденный оттуда, чтобы использовать новые строки.

<xsl:template name="word-count"> 
     <xsl:param name="data"/> 
     <xsl:param name="num"/> 
     <xsl:variable name="newdata" select="$data"/> 
     <xsl:variable name="remaining" select="substring-after($newdata,'&#10;')"/>     

     <xsl:choose> 
       <xsl:when test="$remaining"> 
         <xsl:call-template name="word-count"> 
           <xsl:with-param name="data" select="$remaining"/> 
           <xsl:with-param name="num" select="$num+1"/> 
         </xsl:call-template> 
       </xsl:when> 
       <xsl:when test="$num = 1"> 
         no words... 
       </xsl:when> 
       <xsl:otherwise> 
         <xsl:value-of select="$num"/> 
       </xsl:otherwise> 
     </xsl:choose>     
</xsl:template> 
1

Использование:

string-length() - string-length(translate(., '&#xA;', '')) 

Хотя с помощью выше XPath один вкладыш, вам не нужно XSLT вообще, для comleteness вот она:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="text()"> 
    <xsl:value-of select= 
    "string-length() - string-length(translate(., '&#xA;', ''))"/> 
</xsl:template> 
</xsl:stylesheet> 

Когда это преобразование применяется к предоставленному XML-документу:

<SpecialInstraction>One 
    Two 
    Three 
    Four 
    Five 
    Six 
    Seven 
    Eight 
    Nine 
    Ten 
    Eleven 
    twelve 
    thirteen 
    fourteen 
    fifteen</SpecialInstraction> 

разыскиваемых, правильный результат получается:

14 

Обратите внимание:

Это решение onlu подсчитывает количество символов NL. Почему я игнорировал CR? Просто потому, что в соответствии с W3C XML Specification, любой совместимый XML анализатор должен выполнить следующие действия:

все #xD символы буквально присутствующие в документе XML, либо удалены или заменены символами #xA прежде, чем любая другая обработка сделанный.

Смежные вопросы