的任务是摆脱任何非数字字符在以下CustomerIdentity
元素的XML文件中:更改文本(摆脱非数字字符的)
<ns2:TaxAtSource institutionID="#SG">
<ns2:CantonID>SG</ns2:CantonID>
<ns2:CustomerIdentity>CHE123.456 </ns2:CustomerIdentity>
</ns2:TaxAtSource>
我试过SED (这将是优雅的,但由于非数字字符可以在CustomerIdentity
标签之间的任何地方,因此正则表达式会变得有点多毛)。我也尝试过XSLT,但命名空间ns2在识别标记(未引用的命名空间)时遇到了麻烦。 因此,如果任何人有一个有效的解决方案来处理XML文件,如下所示(其余的应该是不变):
<ns2:TaxAtSource institutionID="#SG">
<ns2:CantonID>SG</ns2:CantonID>
<ns2:CustomerIdentity>123456</ns2:CustomerIdentity>
</ns2:TaxAtSource>
这将是非常赞赏。一位同事建议使用AWK或红宝石,但我认为这也归结为正则表达式。
编辑:我已经尝试了以下XSLT从xsl remove all non-numeric characters and leading 1:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="text()">
<xsl:variable name="vnumsOnly" select=
"translate(., translate(.,'',''), '')
"/>
<xsl:value-of select=
"substring($vnumsOnly, (substring($vnumsOnly,1,1)='1') +1)"/>
</xsl:template>
</xsl:stylesheet>
,但没有相当锻炼。
你所说的 “无引用的命名空间” 是什么意思?如果名称空间前缀没有定义,那么您的数据不符合格式良好的XML,并且不属于XML文件。此外,XSLT不会接受它作为输入。 – 2014-09-01 11:15:07
@codeninja命名空间文件? – 2014-09-01 11:50:03
@mathis,谢谢你指出我的错误,我删除了我的评论。我认为这可能是dtd问题,所以我提到重新确认文件目录。但现在我意识到它的错误/非声明的命名空间声明在根目录 – 2014-09-01 11:59:40