如何return XSL中以字符串开头的输入计数?

How to return the count of input that start with a string in XSL?

我正在尝试 return 以 NB 开头的名称的数量,但我遇到了麻烦 returns 0。我相信我的语法是正确的,所以有点令人沮丧看到它 return 0。任何帮助将不胜感激!

XML 输入:

    <?xml version='1.1' encoding='UTF-8'?>
    <breaches>
        <breach>
            <name>NB111</name>
            <severity>MAJOR</severity>
        </breach>
        <breach>
            <name>NB222</name>
            <severity>MAJOR</severity>
        </breach>
        <breach>
            <name>NB333</name>
            <severity>MAJOR</severity>
        </breach>
        <breach>
            <name>PO999</name>
            <severity>MAJOR</severity>
        </breach>
    </breaches>

XSL

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:template match="/">
    <xsl:value-of select="count(/breaches/breach/name/*[contains(text(), 'NB')])" />
      </xsl:template>
    </xsl:stylesheet>

结果

    <?xml version="1.0" encoding="UTF-8"?>0

你可以这样做:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:value-of select="count(breaches/breach/name[contains(., 'NB')])" />
     </xsl:template>
</xsl:stylesheet>

看到它在这里工作:https://xsltfiddle.liberty-development.net/jxWZS86

I'm trying to return the count of names which start with NB

如果您想计算以“NB”开头的名称,请使用 starts-with() 函数,而不是 contains() 函数:

<xsl:value-of select="count(breaches/breach[starts-with(name, 'NB')])"/>

这实际上计算了 breach 个具有以“NB”开头的子 name 元素的元素。 IOW,它假设每个 breach 只有一个 name。如果这样的假设不正确,那么使用:

<xsl:value-of select="count(breaches/breach/name[starts-with(., 'NB')])"/>

计算实际的 name 个元素。