Попробуйте это в выражении <xsl:value-of>
:
count(//language[contains(concat(' ',.,' '), ' java ')])
Если ваша структура документа относительно статична или у вас есть узлы, называемые language
в других местах, которые служат другой цели, вы можете заменить //language
на /mainNode/book/list/language
.
Бит concat
может показаться немного запутанным, но, убедившись, что в начале и конце текста, который вы просматриваете, есть пробел, и выполнив поиск ' java '
с пробелом по обе стороны, вы выиграли ' неправильно включают другие термины, которые включают java
, например javascript
.
Если 'java' может существовать более одного раза в узле, тогда вам нужно использовать рекурсивный шаблон. Вот один из способов:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:variable name="list">
<xsl:for-each select="//language">
<xsl:call-template name="count">
<xsl:with-param name="lang">java</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="concat('java -- ',string-length($list))" />
</xsl:template>
<xsl:template name="count">
<xsl:param name="lang" />
<xsl:param name="text" select="text()" />
<xsl:if test="contains(concat(' ',$text,' '),concat(' ',$lang,' '))">
<xsl:text>0</xsl:text>
<xsl:call-template name="count">
<xsl:with-param name="lang" select="$lang" />
<xsl:with-param name="text" select="substring-after($text,$lang)" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
По сути, это создает строку из 0
, по одному для каждого вхождения java
, а затем просто использует длину этой строки.
Если у вас есть возможность использовать XSLT 2.0, вы можете создать функцию, которая подсчитывает количество вхождений в строке, и использовать <xsl:value-of select="sum(mycountfunction(//language))" />
или что-то подобное.
Как я указывал в комментарии к вашему вопросу, лучшая разработка исходного XML очень помогла бы; ничего из этого не требуется, если каждое вхождение языка имеет свой собственный элемент. Конечно, это может быть вне вашего контроля, но если у вас есть возможность изменить это (или убедить поставщика изменить это), я настоятельно рекомендую это.