如何在xsl中测试命名空间元素名称

时间:2011-04-14 23:46:29

标签: xslt

我正在做一些xforms开发,并且有一个匹配选择项的模板。如果它是单个选择而不是多个,我想在给定列表的顶部添加一个空值:

<xsl:template match="xforms:select1|xforms:select">
    <xsl:apply-templates select="node()" />
    <xsl:if test=".[name()='xf:select1'] and not (@appearance eq 'full')">
        <xforms:item>
            <xforms:label />
            <xforms:value />
        </xforms:item>
    </xsl:if>
    ...

问题是,这适用于我的一个表单xf:select1(因为match可识别名称空间),但另一种形式的xforms:select1控件已被破坏,因为name()测试仅适用于字符串。

有没有办法让if语句工作,无论我为http://www.w3.org/2002/xforms命名空间做什么前缀?

2 个答案:

答案 0 :(得分:1)

您肯定希望避免任何依赖于名称空间前缀的代码。我想你想使用自我轴:

<xsl:if test="self::xforms:select1 and not (@appearance eq 'full')">

答案 1 :(得分:0)

我所做的是将if分成不同的模板......我喜欢它,因为它是xsl适合的;我讨厌它,因为它是一些匹配逻辑的副本,如果它有一个错误或改进,就必须在多个地方进行更改......

<xsl:template match="xforms:select1[not(xforms:itemset) and not(@appearance eq 'full')]" priority="10">
    <xsl:apply-templates select="node()" />
    <xforms:item>
        <xforms:label />
        <xforms:value />
    </xforms:item>
    <xsl:call-template name="select-itemset"/>
</xsl:template> 

<xsl:template match="xforms:select1[not(xforms:itemset)]|xforms:select[not(xforms:itemset)]">
    <xsl:apply-templates select="node()" />
    <xsl:call-template name="select-itemset"/>
</xsl:template>

<xsl:template name="select-itemset">
    ...