如何在XSLT中删除尾随的emdashes?

时间:2014-08-11 14:21:01

标签: xml regex xslt xslt-2.0

我正在使用带有替换功能的xslt 2.0并尝试进行xml到文本转换。我试图从转换中删除em-dash( - ),如果它出现在xml标记的末尾。

例如

<abc> Hello World —</abc>

应输出为

Hello World

但如果em dash存在于其他任何地方,则应保留,例如。

<abc> Hello —World </abc>

应输出为

Hello —World

我尝试了什么:

<xsl:template match="text()">
<xsl:value-of select="replace(.,'—\s\*&lt;','')"/>
</xsl:template>

但它无效

所以基本上'—\s\*&lt;'模式不起作用。 我正在阅读它作为emdash后跟任意数量的空格,然后打开标签,但我认为我错了。

任何输入都会非常有用。

1 个答案:

答案 0 :(得分:2)

您没有提供足够的信息来诊断问题,但我想我可以猜到。您的问题是您误解了XSLT处理器如何“看到”XML文档。

XML树

当您向XSLT处理器提供源XML文件时,它将由XML解析器(它完全独立于您的XSLT处理器)进行解析。解析器可以完成一系列不同的任务(例如,它可以规范化空格字符),但最重要的是:它构造源XML的抽象模型,即所谓的即可。在XSLT中,此树模​​型称为 XDM 。因此,当XSLT处理器最终看到XML文档时,它就是一个抽象树。

这是相关的,因为树模型由没有标记<>的节点组成,以标记元素的开始和结束。这就是为什么你不能用正则表达式找到它们。

如何在字符串末尾找到短划线?

您提到的模板与文本节点匹配:

<xsl:template match="text()">

要查找字符串末尾的短划线,请使用:

<xsl:value-of select="replace(.,'-\s*$','')"/>

这将替换一个破折号,后跟零或任意数量的空白字符,后跟字符串末尾的空字符串。请注意,不仅删除了破折号 - 空格也将消失。


在XSLT中使用外部服务之前,使用外部服务来测试正则表达式可能会有所帮助。例如,尝试Regexfiddle