如何在XSLT中用Apache Tika处理RTF超链接以解决XML解析错误
解决RTF超链接引发XML解析错误的XSLT处理方案
这是《如何使用XSLT 2/Saxon HE 11.3转换XML中的RTF文本节点?》的后续问题。在处理大数据集时,应用因源RTF中的HYPERLINK代码触发XML解析错误,提示元素类型“a”缺少匹配结束标签。需求明确:无需保留超链接功能,仅需将超链接转为纯文本格式(例如输出 CAESAR DIP: ..\..\SAUCES\Dips\Dip, Caesar.doc)。
当前使用的XSLT代码仅做了空值检查:
<xsl:choose> <xsl:when test="string-length(SPECORMETHOD) > 0"> <rtf-as-xhtml> <xsl:sequence select="tika:parse-rtf(SPECORMETHOD[string-length(.) > 0])"/> </rtf-as-xhtml> </xsl:when> <xsl:otherwise> <xsl:value-of select="'[EMPTY]'"/> </xsl:otherwise> </xsl:choose>
解决方案
方案1:直接提取解析后的纯文本
Tika的parse-rtf会生成带<a>标签的XHTML,但部分RTF超链接解析后会产生不闭合的标签,导致XML解析失败。可以跳过XHTML结构,直接提取所有文本内容:
<xsl:choose> <xsl:when test="string-length(SPECORMETHOD) > 0"> <rtf-plain-text> <xsl:value-of select="tika:parse-rtf(SPECORMETHOD[string-length(.) > 0])//text()"/> </rtf-plain-text> </xsl:when> <xsl:otherwise> <xsl:value-of select="'[EMPTY]'"/> </xsl:otherwise> </xsl:choose>
方案2:预处理RTF移除超链接代码
如果方案1仍有问题,可以在解析前用正则表达式移除RTF中的HYPERLINK标记。RTF超链接通常格式类似{\field{\*\fldinst HYPERLINK "..\..\SAUCES\Dips\Dip, Caesar.doc"}{\fldrslt CAESAR DIP}},替换规则可根据实际格式调整:
<xsl:choose> <xsl:when test="string-length(SPECORMETHOD) > 0"> <!-- 替换RTF超链接为纯文本格式 --> <xsl:variable name="clean-rtf" select="replace(SPECORMETHOD, '\{field\{\*\fldinst HYPERLINK "([^"]+)"\}\{fldrslt ([^\}]+)\}\}', '$2: $1')"/> <rtf-plain-text> <xsl:value-of select="tika:parse-rtf($clean-rtf)"/> </rtf-plain-text> </xsl:when> <xsl:otherwise> <xsl:value-of select="'[EMPTY]'"/> </xsl:otherwise> </xsl:choose>
项目环境
- Eclipse 2022-12(4.26.0)
- Maven
- Apache Tika 2.7.0
- Saxon HE 11.3
- Java SE 1.8
内容的提问来源于stack exchange,提问作者Michael Friedman
相关产品推荐
相关产品推荐

