我的公司为我提供了XSL文件,以适合部门使用。该文件中包含以下内容:
<xsl:template match="title | *[name() = 'title' or contains(@class, '/title ')]">
据我了解,match="title"
与match="*[name()='title']"
相同,这会使初始的title
变得多余。但是,该文件最初是由专门从事XML / XSL / HMTL开发的第三方编写的,因此我认为它存在是有原因的吗?
答案 0 :(得分:2)
如果涉及名称空间,可能会有所不同。 name()
将在XML中返回任何名称空间前缀。并且title
仅在无名称空间或XSLT(如果使用XSLT 2.0)由title
指定的命名空间中匹配xpath-default-namespace
元素。
考虑这种人为设计的XML
<titles>
<title id="1" />
<title id="2" xmlns="test2" />
<test3:title id="3" xmlns:test3="test3" />
</titles>
仅匹配title
的模板将仅匹配第一个模板,而*[name() = 'title']
则将匹配前两个模板。因此,在这种情况下,title
在您的比赛中仍然是多余的。
但是,在XSLT 2.0中,您可以在样式表中使用xpath-default-namespace
为表达式中未前缀元素指定默认名称空间。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xpath-default-namespace="test3">
在这种情况下,匹配title
的模板将匹配XML(title
)中的第三个<test3:title id="3" xmlns:test3="test3" />
,但是匹配*[name() = 'title']
的模板将匹配前两个。
请注意,还有一个local-name()
仅返回没有任何名称空间前缀的节点名称,因此执行*[local-name() = 'title']
将匹配所有三个title
元素。