标识转换 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 编辑器中 运行 时效果很好。当我将其部署到目标系统时,它会抱怨:
- 属性'select'不允许出现在元素中
'xsl:copy'.
- 当我 运行 这个 - 样式表编译期间报告错误
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>
我有以下 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 编辑器中 运行 时效果很好。当我将其部署到目标系统时,它会抱怨:
- 属性'select'不允许出现在元素中 'xsl:copy'.
- 当我 运行 这个 - 样式表编译期间报告错误 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>