XSL根据与元素的接近程度更改文本

时间:2017-12-29 11:40:19

标签: xml xslt

我对XML中的大型语料库中的各种文本进行了一些“更正”,可根据元素的接近程度进行识别(使用XSL 3.0复制文档时)。

例如,我需要移动所有'。'从外到内的元素<date>是这样的:

  <seg><date>foodate</date>. Some variable text here.</seg>

为:

  <seg><date>foodate.</date> Some variable text here.</seg>

或者根据“foo”与<date>的接近程度更改文字:

  <seg><date>foodate</date> foo some variable text here</seg>

为:

  <seg><date>foodate</date> foo2 some variable text here</seg>

我无法基于与其他元素的接近度来隔离字符串并对它们执行函数(不是包含所讨论字符串的所有文本的一般更改)。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

您可以编写匹配模式,例如seg/date[following-sibling::node()[1][self::text()[starts-with(., '.')]]]匹配date元素的seg子元素,其中date元素的下一个兄弟是以点开头的文本节点{ {1}},然后您只需要转换内容以添加点,并需要文本节点的模板分别删除第一个字符的点:

.

http://xsltfiddle.liberty-development.net/gWcDMee

第二个条件可以使用类似的方法在文本节点上进行匹配并对其进行操作,尽管通常是&#34; word&#34;更难以与XSLT / XPath 2或3支持的正则表达式语言匹配,因为我认为它没有办法匹配单词边界。下面是一些尝试在文本节点的开头匹配可选的空格,后跟一些术语,如<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="#all" version="3.0"> <xsl:mode on-no-match="shallow-copy"/> <xsl:template match="seg/date[following-sibling::node()[1][self::text()[starts-with(., '.')]]]"> <xsl:copy> <xsl:value-of select=". || '.'"/> </xsl:copy> </xsl:template> <xsl:template match="seg/text()[ starts-with(., '.') and preceding-sibling::node()[1][self::date]]"> <xsl:value-of select="substring(., 2)"/> </xsl:template> </xsl:stylesheet> ,后跟非单词字符或字符串的结尾:

foo

http://xsltfiddle.liberty-development.net/gWcDMee/1