XSLT:计算每个正则表达式匹配项的出现次数

时间:2019-12-09 00:55:30

标签: regex xslt

我有一个带有标记为的句子的XML文件,我想列出与正则表达式匹配的句子以及该特定字符串与句子匹配的次数。

现在我有一个存储在$ search中的正则表达式:

<table border="1">
    <xsl:apply-templates select="//s[matches(., $search)]"/>
</table>

<xsl:template match="s">
    <tr>
        <xsl:analyze-string select="." regex="{$search}">
                <xsl:matching-substring>
                    <td><xsl:value-of select="regex-group(1)"/></td>                     
                    <xsl:value-of select="count(//s[matches(., regex-group(1))])"/>
                </xsl:matching-substring>
                <xsl:non-matching-substring>
                    <td><xsl:value-of select="."/></td>
                </xsl:non-matching-substring>
            </xsl:analyze-string>        
    </tr>
</xsl:template>

count()行引发错误:“前导'/'无法选择包含上下文项的树的根节点:上下文项不是节点”。

如何计算与正则表达式$ search匹配的所有句子?

编辑: 为说明起见,假设我的正则表达式为“ colou?rs”,而XML为:

<s>I like colors.</s> <s>colours are nice.</s> <s>there are two colors.</s> 

我想要类似的东西

I like colors. - 2 
colours are nice. - 1 
there are two colors. - 2

1 个答案:

答案 0 :(得分:1)

您只需要声明此全局变量即可从任何位置访问文档根目录:

<xsl:variable name="docRoot" select="/"/>

然后执行以下操作:

<xsl:template match="s">
    <tr>            
        <xsl:analyze-string select="." regex="{$search}">                
            <xsl:matching-substring>
                <xsl:variable name="myMatch"><xsl:value-of select="regex-group(1)"/></xsl:variable>
                <td><xsl:value-of select="regex-group(1)"/>
                <xsl:text> (</xsl:text>
                    <xsl:value-of select="count($docRoot//s[matches(., $myMatch)])"/>
                <xsl:text> occurrences)</xsl:text>   
                </td>                                                             
            </xsl:matching-substring>
            <xsl:non-matching-substring>
                <td><xsl:value-of select="."/></td>
            </xsl:non-matching-substring>                
        </xsl:analyze-string>                    
    </tr>
</xsl:template>