XSL:按元素匹配是否与按元素名称匹配相同?

时间:2019-03-13 16:24:57

标签: xslt

我的公司为我提供了XSL文件,以适合部门使用。该文件中包含以下内容:

<xsl:template match="title | *[name() = 'title' or contains(@class, '/title ')]">

据我了解,match="title"match="*[name()='title']"相同,这会使初始的title变得多余。但是,该文件最初是由专门从事XML / XSL / HMTL开发的第三方编写的,因此我认为它存在是有原因的吗?

1 个答案:

答案 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元素。