替换XSLT中的特殊字符

替换XSLT中的特殊字符,xslt,string,Xslt,String,我想从XSLT中的字符串中删除字母以外的字符。比如说 <Name>O'Niel</Name> = <Name>ONiel</Name> <Name>St Peter</Name> = <Name>StPeter</Name> <Name>A.David</Name> = <Name>ADavid</Name> O'Niel=ONiel 圣彼得 大卫=阿

我想从XSLT中的字符串中删除字母以外的字符。比如说

<Name>O'Niel</Name> = <Name>ONiel</Name>
<Name>St Peter</Name> = <Name>StPeter</Name>
<Name>A.David</Name> = <Name>ADavid</Name>
O'Niel=ONiel
圣彼得
大卫=阿达维
我们可以在XSLT中使用正则表达式来实现这一点吗?哪种方法是正确的


编辑:这需要在XSLT1.0上完成。

有一种纯粹的XSLT方法来完成

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:variable name="vAllowedSymbols"
        select="'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'"/>
    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="text()">
        <xsl:value-of select="
            translate(
                .,
                translate(., $vAllowedSymbols, ''),
                ''
                )
            "/>
    </xsl:template>
</xsl:stylesheet>

此样本的结果:

<t>
    <Name>O'Niel</Name>
    <Name>St Peter</Name>
    <Name>A.David</Name>
</t>

奥尼尔
圣彼得
A.大卫
将是:

<t>
    <Name>ONiel</Name>
    <Name>StPeter</Name>
    <Name>ADavid</Name>
</t>

奥尼尔
斯特佩特
阿达维
这里有一个2.0选项:

编辑:对不起……1.0要求是在我开始回答问题后添加的。

XML

<?xml version="1.0" encoding="UTF-8"?>
<doc>
  <Name>O'Niel</Name>
  <Name>St Peter</Name>
  <Name>A.David</Name>
</doc>
使用:


我刚刚根据本例中的代码创建了一个函数

    <xsl:function name="lancet:stripSpecialChars">
    <xsl:param name="string" />
    <xsl:variable name="AllowedSymbols" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789()*%$#@!~&lt;&gt;,.?[]=- +   /\ '"/>
    <xsl:value-of select="
        translate(
            $string,
            translate($string, $AllowedSymbols, ''),
            ' ')
        "/>
</xsl:function> 

用法示例如下所示:

<xsl:value-of select="lancet:stripSpecialChars($string)"/>

最快的方法是


内部翻译将删除字母表(所需的字符)。翻译的结果会留下其他字符。外部翻译删除了那些不需要的字符

@Flack-这太棒了。我的解决方案在用任何其他字符序列替换黑名单中的单个字符时很有用,但对于应用白名单或简单的一对一替换,
translate
是一个更好的解决方案。@lwburk。您也可以使用
翻译
作为“黑名单”。这将更加简单。当不需要替换“字符串到另一个字符串”时,不需要递归。如何将此模板应用于像/Application/Contact/FirstName这样的节点?@Amzath。无论何时获取节点和属性的字符串值,基本上都可以使用XPath Expr,从
translate
开始。@Flack-对,这是我想说的,这就是我删除帖子的最终原因。您需要XSLT 1.0中的递归方法来进行更复杂的替换,但在本例中这完全是过火了。请检查我的答案,如何在没有RegExp的情况下进行替换,顺便说一句,XSLT/XPath 1.0不支持RegExp。
replace(.,'[^A-Z]','','i')
replace(.,'\P{L}','')
    <xsl:function name="lancet:stripSpecialChars">
    <xsl:param name="string" />
    <xsl:variable name="AllowedSymbols" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789()*%$#@!~&lt;&gt;,.?[]=- +   /\ '"/>
    <xsl:value-of select="
        translate(
            $string,
            translate($string, $AllowedSymbols, ''),
            ' ')
        "/>
</xsl:function> 
<xsl:value-of select="lancet:stripSpecialChars($string)"/>