含命名空间的web.xml导致XSL模板匹配失效问题求助
解决带JavaEE命名空间的web.xml XSL模板匹配问题
这问题我之前处理过,核心原因是XML命名空间的作用机制——当你的<web-app>节点声明了默认命名空间xmlns="http://xmlns.jcp.org/xml/ns/javaee"后,所有子元素(比如<servlet>)都会自动继承这个命名空间。而你原来的XSL模板没有指定对应的命名空间,自然匹配不到这些带命名空间的元素。
具体解决方案有两种,你可以根据习惯选择:
方案1:声明命名空间前缀并在模板中使用
在你的XSL根元素<xsl:stylesheet>里添加JavaEE命名空间的前缀声明,然后修改模板的匹配路径,给每个元素加上前缀:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" <!-- 声明JavaEE命名空间,前缀用jee(可自定义) --> xmlns:jee="http://xmlns.jcp.org/xml/ns/javaee"> <xsl:template name="main" match="/jee:web-app/jee:servlet[@id='identifier']"> <!-- 这里写你的处理逻辑 --> </xsl:template> </xsl:stylesheet>
方案2:设置默认XPath命名空间(更简洁)
如果不想每次都写前缀,可以在<xsl:stylesheet>里添加xpath-default-namespace属性,指定默认的命名空间URI,这样模板里的路径就可以和无命名空间时保持一致:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" <!-- 设置XPath默认命名空间为JavaEE的URI --> xpath-default-namespace="http://xmlns.jcp.org/xml/ns/javaee"> <xsl:template name="main" match="/web-app/servlet[@id='identifier']"> <!-- 这里写你的处理逻辑 --> </xsl:template> </xsl:stylesheet>
关键注意点:
- 命名空间的URI必须完全一致,包括大小写、路径细节,哪怕差一个字符都会导致匹配失败;
- Saxon 8.7支持XSLT 2.0,所以上述两种方案都能正常工作;
- 无命名空间的XML能匹配,是因为模板默认匹配无命名空间的元素,一旦元素属于某个命名空间,必须在模板中明确指定才能匹配。
内容的提问来源于stack exchange,提问作者Gibson Lunaziz
相关产品推荐
相关产品推荐

