我想使用XSLT来计算XML文档中特定节点中字符串出现次数.考虑这个例子
<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>
</book>
<book>
<price> 300 </price>
<city> delhi </city>
<list>
<language> java ruby </language>
</list>
</book>
</mainNode>
Run Code Online (Sandbox Code Playgroud)
在这里,我想计算"java"的出现次数
我希望输出像这样:: java - 3
这该怎么做???任何的想法???
用途:
count(/*/*/list/language[contains(., 'java')])
Run Code Online (Sandbox Code Playgroud)
完整的XSLT转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
java -- <xsl:value-of select=
"count(/*/*/list/language[contains(., 'java')]) "/>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
当应用于提供的XML文档时:
<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>
</book>
<book>
<price> 300 </price>
<city> delhi </city>
<list>
<language> java ruby </language>
</list>
</book>
</mainNode>
Run Code Online (Sandbox Code Playgroud)
产生了想要的正确结果:
java -- 3
Run Code Online (Sandbox Code Playgroud)
更新:
如果我们要计算所有的字符串出现次数-不仅仅包含字符串的所有节点-这里是如何做到这一点:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:param name="pWord" select="' java '"/>
<xsl:template match="/">
<xsl:variable name="vResult">
<xsl:apply-templates/>
</xsl:variable>
<xsl:value-of select="concat($pWord, '--- ')"/>
<xsl:value-of select="string-length($vResult)"/>
</xsl:template>
<xsl:template match="list/language" name="countWord">
<xsl:param name="pText" select="."/>
<xsl:if test="contains($pText, $pWord)">
<xsl:text>X</xsl:text>
<xsl:call-template name="countWord">
<xsl:with-param name="pText"
select="concat(' ', substring-after($pText, $pWord))"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
当此转换应用于此XML文档时:
<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>
</book>
<book>
<price> 300 </price>
<city> delhi </city>
<list>
<language> java java ruby </language>
</list>
</book>
</mainNode>
Run Code Online (Sandbox Code Playgroud)
产生了想要的正确结果:
java --- 4
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16606 次 |
| 最近记录: |