我正在使用一个带有替换功能的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\*<','')"/>
</xsl:template>
但是没有用
所以基本上'—\s\*<'
模式不起作用。我阅读它作为emdash其次是任何数量的空格,然后打开标签,但我认为我错了地方。
任何输入都将非常有用。
1条答案
按热度按时间64jmpszr1#
您没有提供足够的信息来诊断问题,但我想我可以猜到。您的问题是误解了XSLT处理器如何“看到”XML文档。
XML树
当您向XSLT处理器提供源XML文件时,XML解析器(它完全独立于XSLT处理器)将对该文件进行解析。解析器完成了一系列不同的任务(例如,它可以规范化空白字符),但最重要的是:它构造了源XML的抽象模型,即所谓的树。在XSLT中,这种树模型称为XDM。因此,当XSLT处理器最终看到XML文档时,它是一个抽象树。
这是相关的,因为树模型由没有标记
<
和>
来标记元素的开始和结束的节点组成。这就是为什么你不能用正则表达式找到它们。那么,如何在字符串的末尾找到破折号?
您提到的模板匹配文本节点:
要查找字符串末尾的破折号,请用途:
这将用空字符串替换破折号,后跟零或任意数量的空格字符,后跟字符串结尾。请注意,不仅破折号被删除-空格也将消失。
在XSLT中使用正则表达式之前,使用外部服务来测试它们可能会有所帮助。