单词前后的上下文(xslt)

时间:2014-08-19 07:27:20

标签: xslt

<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

1 个答案:

答案 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>&#x0a;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>&#x0a;</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