我正在使用带有替换功能的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\*<','')"/>
</xsl:template>
但它无效
所以基本上'—\s\*<'
模式不起作用。
我正在阅读它作为emdash后跟任意数量的空格,然后打开标签,但我认为我错了。
任何输入都会非常有用。
答案 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。