<block>
<p>(...) nogen Forundring, med dyb Bedrøvelse, men <seg>end</seg> dybere Rolighed, læsde jeg Baggesens Svar til mig i Skilderiet No. 9 (...)</p>
</block>
对于xslt来说,我是全新的。如何选择上下文,前后三个单词,用元素标记的内容?我一直在尝试使用string-before和string-after,但是根本没有成功。
结果应如下所示:
word: end
context: dyb Bedrøvelse, men end dybere Rolighed, læsde
答案 0 :(得分:0)
我们不知道您的XSLT处理器是否支持XSLT 2.0,但是在我意识到这一点之后我写了一个答案:
版本重要的原因是下面的解决方案使用仅在XSLT 2.0中可用的函数,即tokenize()
。如果你标记化你想要以这种方式处理的字符串,那么说“选择前后三个单词”之类的内容才有意义。在标记化之前,XSLT处理器不知道“单词”的概念。
<强>样式表强>
编辑:作为对您评论的回复,我稍微修改了代码以使用多个seg
元素。当然,这会引入您需要处理的其他困难。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text"/>
<xsl:template match="seg">
<xsl:text>word: </xsl:text>
<xsl:value-of select="."/>
<xsl:text>
context: </xsl:text>
<xsl:variable name="tok-before" select="tokenize(normalize-space(string-join(preceding::text(),'')),' ')"/>
<xsl:variable name="tok-after" select="tokenize(normalize-space(string-join(following::text(),'')),' ')"/>
<xsl:value-of select="subsequence($tok-before,count($tok-before) -2)"/>
<xsl:value-of select="concat(' ',.,' ')"/>
<xsl:value-of select="subsequence($tok-after,1,3)"/>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="text()"/>
</xsl:transform>
XML输出
word: end
context: med dyb Bedrøvelse, men end dybere Rolighed, læsde
您可以在线尝试和操作此解决方案here。