我正在尝试运行这个XPath表达式(即,尝试计算XML文件中有多少元素内容字符串以字母1 -f ('a')或字母2 -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 )"/>
,但我不知道如何引用"当前值"。我只知道它通常用一个点来表示。"。我不知道该把'template match'放在哪里,或者是否需要。
另一方面,这段代码可以工作,因为我已经指定它应该在'/n-grams-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-grams-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>
谢谢
通过链接的样式表,很明显您根本没有使用模板匹配。您只需匹配文档的根节点(/
),然后从中调用模板。
.
)就是文档根。这可以通过将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>
,然后简化为:
n-gram[starts-with(.,$letter-one-f) or starts-with(.,$letter-two-f)]
为当前节点更改为最上面的节点(n-grams-sorted)。
解决方案如下:
<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…所以解决方案是使用string-length(.)…