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

发布于 2024-11-01 15:55:40 字数 686 浏览 1 评论 0原文

我正在做一些 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 命名空间设置什么前缀?

I'm doing some xforms development and have a template that matches select items. If it's a single select instead of multiple, I want to add an empty value to the top of the given list:

<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>
    ...

The issue is that this worked for one of my forms that had an xf:select1 (since the match is namespace aware), but the xforms:select1 controls in another form were broken since the name() test is only for strings.

Is there a way I can make this if statement work, regardless of what prefix I make for the http://www.w3.org/2002/xforms namespace?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

场罚期间 2024-11-08 15:55:40

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

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

You definitely want to avoid any code which relies on namespace prefixes. I think you want to use the self axis:

<xsl:if test="self::xforms:select1 and not (@appearance eq 'full')">
人生戏 2024-11-08 15:55:40

我所做的是将 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">
    ...

What I have done is split out the if into different templates... I like it because it's what xsl is geared for; I hate it because it's yet another copy of some match logic that would have to be changed in multiple places if it had a bug or an improvement...

<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">
    ...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文