如何在XPath(XSLT)中引用当前值?

时间:2011-08-11 08:41:28

标签: xslt xpath xslt-1.0

我正在尝试运行这个XPath表达式(也就是说,尝试计算我的XML文件中有多少元素内容字符串以letter-one-f('a')或letter-two-f('A')结尾:

<xsl:value-of  select="count( substring(.,string-length(.) -1,string-length(.) -1)=$letter-one-f or substring(., string-length(.) -1,string-length(.) -1)=$letter-two-f )"/>

但我不知道如何引用'当前值'。我所知道的是它通常用点''表示。 。我不知道在哪里放'模板匹配'或者甚至需要它。

另一方面,这段代码有效,因为我已经指定它应该以'/ n-gram-sorted / n-gram'为单位:

<xsl:value-of select="count(/n-grams-sorted/n-gram[starts-with(.,$letter-one-f) or starts-with(.,$letter-two-f) ])"/>

我只是不知道如何将它应用于第一个表达式。我将在哪里获得“当前价值”?我怎么告诉它我要查看'/ n-gram-sorted / n-gram'?这就是我需要让我的表达工作(我在编辑器的'xpath视图'中尝试过它)。

源XML文件示例:

    <n-grams-sorted analysis="N_GRAM_TOKEN3" range="Total Set">
        <n-gram position="1" frequency="3535" probability="0.0447735">. = =</n-gram>
        <n-gram position="2" frequency="322" probability="0.0040784">= = De</n-gram>
        <n-gram position="3" frequency="284" probability="0.0035971">= = Het</n-gram>
        <n-gram position="4" frequency="207" probability="0.0026218">= = Hij</n-gram>
        <n-gram position="5" frequency="168" probability="0.0021278">= = Dit</n-gram>

由于

2 个答案:

答案 0 :(得分:0)

通过链接的样式表,很明显你根本没有使用模板匹配。您只是匹配文档的根节点(/),然后从中调用模板。

通过这种方式,您的当前节点.)是文档根目录。这可以通过将XPath更改为:

来验证
n-grams-sorted/n-gram[starts-with(.,$letter-one-f) or starts-with(.,$letter-two-f) ]

或,等于

./n-grams-sorted/n-gram[starts-with(.,$letter-one-f) or starts-with(.,$letter-two-f) ]

或,等于

current()/n-grams-sorted/n-gram[starts-with(.,$letter-one-f) or starts-with(.,$letter-two-f) ]

根据您的工作情况,如果您只处理n-gram节点,我认为您可以用以下内容替换样式表初始规则:

    <xsl:template match="n-grams-sorted">
            <xsl:call-template name="draw-grid">
                    <xsl:with-param name="rcount">28</xsl:with-param>
                    <xsl:with-param name="ccount">6</xsl:with-param>
                    <xsl:with-param name="r">0</xsl:with-param>
                    <xsl:with-param name="c">0</xsl:with-param>
            </xsl:call-template>
    </xsl:template>

然后将XPath简化为:

  n-gram[starts-with(.,$letter-one-f) or starts-with(.,$letter-two-f)]

将当前节点更改为最顶层节点( n-gram-sorted )。

答案 1 :(得分:0)

以下是解决方案:

<xsl:value-of  select="count(/n-grams-sorted/n-gram[substring(.,string-length(.), string-length(.))=$letter-one-f or substring(.,string-length(.), string-length(.))=$letter-two-f ] )"/>

整个问题不是当前节点..问题是我一直得到'0'因为我做了字符串长度(。)-1,这是不正确的,因为那样会意思是“sonya”将成为“sony”并从'y'开始。 'y'永远不会导致'a',这就是为什么0 ...所以解决方案是使用字符串长度(。)..而不是-1。