如何使用XSLT按句子标记文本

时间:2016-06-21 17:13:10

标签: xml xslt xslt-2.0 tokenize

我已经达到了我对XSLT知识的极限,但存在以下问题。

我有一个看起来像这样的XML文件,简化:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<p>
    <w>This</w>
    <w>is</w>
    <w>a</w>
    <w>sentence</w>
    <w>with</w>
    <w>a</w>
    <entity type="name">Name</entity>
    <w>and</w>
    <w>a</w>
    <entity type="place">Place</entity>
    <w>etc</w>. <w>This</w>
    <w>is</w>
    <w>another</w>
    <w>sentence</w>
    <w>with</w>
    <w>an</w>
    <w>abbrev</w>. <w>before</w>
    <w>its</w>
    <w>end</w>. <w>Is</w>
    <w>this</w>
    <w>a</w>
    <w>question</w>? <w>Sure</w>
    <w>it</w>
    <w>is</w>! </p>
</root>

文字已经被单词标记。我需要自动标记句子。为此,我有一个变量,其中包含结束句子的可能字符:

<xsl:variable name="SEnd">.!?</xsl:variable>

所以,我需要一个XSLT 2.0样式表,它将:

  • 遍历每个段落
  • 将字组(<w>)组合在一起,从段落中的第一个<w>开始,以<w>元素结尾,其直接兄弟text()节点以其中一个成员开头变量集&#34; SEnd&#34;,但是当且仅当following-sibling::w以大写字母开头时(这必须是REGEX \p{Lu}而不仅仅是[A-Z],因为我有多个脚本;
  • <s></s>
  • 中包装上述每个组

这种方式<w>abbrev</w>.不会被识别为句子的最后一个单词,因为它后跟一个小写单词。

结果应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<p>
    <s><w>This</w>
        <w>is</w>
        <w>a</w>
        <w>sentence</w>
        <w>with</w>
        <w>a</w>
        <entity type="name">Name</entity>
        <w>and</w>
        <w>a</w>
        <entity type="place">Place</entity>
        <w>etc</w>.</s>
    <s><w>This</w>
        <w>is</w>
        <w>another</w>
        <w>sentence</w>
        <w>with</w>
        <w>an</w>
        <w>abbrev</w>. <w>before</w>
        <w>its</w>
        <w>end</w>.</s>
    <s><w>Is</w>
        <w>this</w>
        <w>a</w>
        <w>question</w>?</s>
    <s><w>Sure</w>,
        <w>it</w>
        <w>is</w>!</s>
</p>
</root>

我知道这不是防弹的,并且会有例外情况,但这对于这项特殊任务并不重要。我从概念上理解这个问题,我认为应该使用<xsl:for-each-group>,但我不知道如何将它们全部放在一起。

我非常感谢你的帮助。

一切顺利, 丁鲷

1 个答案:

答案 0 :(得分:1)

怎么样:

nullglob