标识转换 XSLT - 删除特殊字符

Idnentity transform XSLT - remove special characters

我有以下 xml.

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <a>124!</a>
    <b>$ Dolar</b>
    <c> # number</c>
    <d bu='5'>space space</d>
    <e>
        <one>! one</one>
        <two>two @</two>
        <three>
            <four>$ four</four>
            <five>% five</five>
                <six thisIsSix='six' sevrn='red'>
                    <seven>7</seven>
                </six>
        </three>
    </e>
    <f>@ at</f>
</root>

我使用下面的 xsl 来去除特殊字符

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">

    <xsl:output indent="yes" media-type="xml"/>

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


    <xsl:template match="*">
        <xsl:element name="{local-name()}" namespace="{namespace-uri()}">
            <xsl:if test="@*">
                <xsl:for-each select="@*">
                    <xsl:attribute name="{./local-name()}" select="."/>
                </xsl:for-each>
            </xsl:if>
            <xsl:choose>
                <xsl:when test="./*">
                        <xsl:apply-templates select="node()"/>
                </xsl:when>
                <xsl:otherwise>
                        <xsl:copy
                            select="normalize-space(replace(., '[^A-Za-z0-9.@:\-_ ]', ' '))"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

当我在 oxygen xml 编辑器中 运行 时效果很好。当我将其部署到目标系统时,它会抱怨:

  1. 属性'select'不允许出现在元素中 'xsl:copy'.
  2. 当我 运行 这个 - 样式表编译期间报告错误 xsl:apply-templates 的@select 属性的必需项类型是 node();提供的值具有项目类型 xs:string

我该如何重构它?

谢谢

为文本节点编写模板:

<xsl:template match="text()"><xsl:value-of select="normalize-space(replace(., '[^A-Za-z0-9.@:\-_ ]', ' '))"/></xsl:template>

剩下的通过恒等变换处理

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