我同意 Tomalak 不与之合作,local-name()
并且典型的方法是使用self::
轴进行匹配:
<xsl:when test="self::n:p or self::n:ul or self::n:para">
<xsl:call-template name="whatever" />
</xsl:when>
要回答您关于析取的具体问题,是的,XSLT 2.0 将以命名空间安全的方式准确地为您提供所需的东西,但我告诉我的 XSLT 学生,它确实并不比上述内置语法更优雅。
XSLT 2.0 允许测试singleton = ( sequence )
并true()
在单例等于序列的任何成员时返回。因此,以下将返回true()
:
'b' = ( 'a', 'b', 'c' )
如果您在没有命名空间的情况下使用 HTML,则可以对序列使用以下单例测试:
test="node-name(.)=( QName('','p'), QName('','ul'), QName('','sec') )
在 XHTML 中,您可以使用以下内容:
<xsl:variable name="ns" select="'http://www.w3.org/1999/xhtml'"/>
<xsl:if test="node-name(.)=( QName($ns,'p'), QName($ns,'ul'), QName($ns,'sec') )"/>
但是,真的,我不认为这比:
xmlns:x="http://www.w3.org/1999/xhtml"
...
test="self::x:p or self::x:ul or self::x:para"
我想如果您只使用 XHTML,您可以使用以下内容:
xpath-default-namespace="http://www.w3.org/1999/xhtml"
...
test="self::p or self::ul or self::para"
但是在我的专业工作中,当我保证我的输入只在一个命名空间中时,我只使用了每个 xpath-default-namespace。如果我的输入可以有多个命名空间,我从不使用它。