如何使用XSL筛选含&#x..;编码特殊字符的XML叶元素?
解决方案:筛选包含
&#x..;编码特殊字符的XML叶元素 你的问题核心在于:XML解析器读取文件时,会自动将º这类实体编码解码为对应的Unicode特殊字符(比如º对应字符º,ª对应ª)。所以在XSLT中访问节点文本时,你看到的是解码后的字符,而非原文件中的&#x..;字符串,这直接导致之前的匹配逻辑失效。
下面提供最直接的解决方法:
方法:匹配非ASCII字符
由于你的XML采用ASCII编码,所有特殊字符都通过实体表示,解码后这些字符的Unicode码点必然超出ASCII范围(0-127)。因此可以用正则表达式匹配非ASCII字符,精准筛选目标叶元素。
修改后的XSLT代码
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"> <xsl:output omit-xml-declaration="yes"/> <xsl:template match="/"> <xsl:text>The following elements in the input file contain special characters: </xsl:text> <xsl:for-each select="//*[not(*) and matches(., '[^\x00-\x7F]')]"> <xsl:copy-of select="."/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
代码说明
matches(., '[^\x00-\x7F]'):正则表达式匹配所有不在ASCII范围内的字符,正好对应原XML中用&#x..;编码的特殊字符。//*[not(*)]:筛选所有没有子元素的叶节点。
预期输出
运行该XSLT后,会得到你需要的结果:
The following elements in the input file contain special characters: <element2>Text containing special characters: 1º-2ª</element2>
如果必须直接匹配原文件中的&#x字符串,需要修改原XML文件将&转义为&(即把º改为&#xba;),但这种方式需要改动源文件,实用性较低,因此优先推荐上述方法。
内容的提问来源于stack exchange,提问作者tj86430
相关产品推荐
相关产品推荐

