替换XSLT中的特殊字符

时间:2011-02-22 21:17:12

标签: xslt string

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

<Name>O'Niel</Name> = <Name>ONiel</Name>
<Name>St Peter</Name> = <Name>StPeter</Name>
<Name>A.David</Name> = <Name>ADavid</Name>

我们可以在XSLT中使用正则表达式来执行此操作吗?哪种方法可以实现?

编辑:这需要在XSLT 1.0上完成。

4 个答案:

答案 0 :(得分:19)

有一种纯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>

将是:

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

答案 1 :(得分:10)

这是一个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

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="*|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="text()">
    <xsl:value-of select="replace(.,'[^a-zA-Z0-9]','')"/>
  </xsl:template>

</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<doc>
   <Name>ONiel</Name>
   <Name>StPeter</Name>
   <Name>ADavid</Name>
</doc>

答案 2 :(得分:2)

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

    <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)"/>

答案 3 :(得分:0)

最快的方法是 final int fixed = 500; int minLimit = 0; int maxLimit; for (maxLimit = fixed; maxLimit <= order.size(); maxLimit += fixed) { List<Orders> orderSubList = order.subList(minLimit, maxLimit); HttpEntity<List<Orders>> requestEntity = new HttpEntity<List<Orders>>(orderSubList, headers); RestTemplate restTemplate = new RestTemplate(); System.out.println("Sending" + " " + minLimit + " " + "to" + " " + maxLimit + " " + "order data"); sendToCarwings(restTemplate, requestEntity); System.out .println("Successfully sent" + " " + minLimit + " " + "to" + " "+maxLimit + " " + "order data"); minLimit = maxLimit; }

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