我想知道是否有一种方法可以更方便地在测试表达式中格式化dusjunctions。目前它看起来像这样:
<xsl:when test="local-name() = 'p' or local-name() = 'ul' or local-name() = 'sec'" >
<xsl:call-template name="whatever" />
</xsl:when>
如果我想在这里测试大约10个元素,那么找到我已经添加的元素是非常不方便的。
2.0中有类似的东西吗?
<xsl:when test="local-name() = 'p'|'ul'|'sec'" >
更新
在2.0中如何:
<xsl:when test="local-name() = ('p','ui','sec')" >
<xsl:call-template name="whatever" />
</xsl:when>
答案 0 :(得分:4)
根本不使用local-name()
,使用正确的命名空间声明和节点测试。
这假设您的XSLT中有xmlns:n="..."
声明。
<xsl:when test="self::n:p or self::n:ul or self::n:para">
<xsl:call-template name="whatever" />
</xsl:when>
更好,使用模板匹配。
<xsl:template match="n:p | n:ul | n:para">
<xsl:call-template name="whatever" />
</xsl:template>
如果您绝对必须使用字符串表达式和local-name()
,则可以使用index-of()
<xsl:when test="index-of(('p', 'ul', 'sec'), local-name())">
<xsl:call-template name="whatever" />
</xsl:when>
*这是有效的,因为index-of()
在找到匹配时返回非零数字,而非零数字在布尔上下文中评估为true
。功能
虽然我强烈建议不要在这种特殊情况下这样做,因为它与XSLT的设计原则相矛盾。
答案 1 :(得分:2)
我同意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。如果我的输入可以有多个名称空间,我从不使用它。