regex 如何删除XSLT中的尾随破折号?

5w9g7ksd  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(182)

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

<abc> Hello World —</abc>

应输出为

Hello World

但如果EM破折号出现在其他任何地方,则应保留它,例如。

<abc> Hello —World </abc>

应输出为

Hello —World

我尝试过的:

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

但是没有用
所以基本上'—\s\*&lt;'模式不起作用。我阅读它作为emdash其次是任何数量的空格,然后打开标签,但我认为我错了地方。
任何输入都将非常有用。

64jmpszr

64jmpszr1#

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

XML树

当您向XSLT处理器提供源XML文件时,XML解析器(它完全独立于XSLT处理器)将对该文件进行解析。解析器完成了一系列不同的任务(例如,它可以规范化空白字符),但最重要的是:它构造了源XML的抽象模型,即所谓的树。在XSLT中,这种树模型称为XDM。因此,当XSLT处理器最终看到XML文档时,它是一个抽象树。
这是相关的,因为树模型由没有标记<>来标记元素的开始和结束的节点组成。这就是为什么你不能用正则表达式找到它们。

那么,如何在字符串的末尾找到破折号?

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

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

要查找字符串末尾的破折号,请用途:

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

这将用空字符串替换破折号,后跟零或任意数量的空格字符,后跟字符串结尾。请注意,不仅破折号被删除-空格也将消失。
在XSLT中使用正则表达式之前,使用外部服务来测试它们可能会有所帮助。

相关问题