xml - 使用 XSLT 计算 XML 中字符串的出现次数

标签 xml xslt count

我想使用 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>      

这里我要统计“java”出现的次数

我想要这样的输出::java -- 3

这是怎么做到的???有什么想法吗???

最佳答案

使用:

count(/*/*/list/language[contains(., 'java')])

完整的 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>

应用于提供的 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>

产生了想要的、正确的结果:

 java -- 3

更新:

如果我们要计算该字符串的所有 出现次数 -- 而不仅仅是包含该字符串的所有节点 -- 以下是如何做到这一点:

<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>

当此转换应用于此 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>

产生了想要的、正确的结果:

 java --- 4

关于xml - 使用 XSLT 计算 XML 中字符串的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6679705/

相关文章:

c++ - 无法使用 Xerces-C++ 解析 XML

java - 从 Build.xml(ANT) 执行 TestNG.xml 文件

xslt - 寻找 XSLT 社区

java - 用于 Java 的 XSLT 框架

xslt - XSL msxsl :node-set problem

mysql - 如何为订单及其项目编写自定义 MySQL 选择查询

python - 计算字符串中最大连续 "a"的数量。 python 3

xml - 添加 XSD 时 XSLT 转换失败

xml - 如何将 "expand"递归地全部包含在 XML/XSD 中?

java - 如何使用 Java 在 MongoDB 中通过嵌入数组过滤文档