XSLT转换时如何替换元素名称中的()字符解决无效元素名错误
问题原因
报错是因为XML元素名称不允许包含(和)这类特殊字符,原XSLT只替换了空格为下划线,没有处理属性名里的括号,导致生成的元素名违反XML语法规则。
修正后的XSLT代码
如果希望移除括号并保留语义,使用嵌套的translate函数先清理括号,再替换空格:
<xsl:template match="Attribute"> <xsl:element name="{translate(translate(@name, '()', ''), ' ', '_')}"> <xsl:value-of select="Values/Value/@Name"/> </xsl:element> </xsl:template>
如果想把括号也替换为下划线(替代移除),可以一次性指定所有要替换的字符:
<xsl:template match="Attribute"> <xsl:element name="{translate(@name, ' ()', '__')}"> <xsl:value-of select="Values/Value/@Name"/> </xsl:element> </xsl:template>
补充说明
你给出的预期输出<napiecie_wyjsciowe_(max)>12 V</napiecie_wyjsciowe_(max)>其实不符合XML规范——XML元素名称不能包含(和),这类输出会被视为无效XML。因此更合理的做法是将括号替换或移除,生成合法的元素名。
内容的提问来源于stack exchange,提问作者user20508390
相关产品推荐
相关产品推荐

