0

我正在解析一个文档,其行为不同,具体取决于 id 属性是否是值集合的元素(下面代码中的 $item-ids )。我的问题是,为什么我需要分配一个变量,然后与该值进行比较,如下所示:

<xsl:template match="word/item">
    <xsl:variable name="id" select="@abg:id"/>
    <xsl:if test="$item-ids[.=$id]">
        <xsl:message>It matches!</xsl:message>
    </xsl:if>
</xsl:template>

似乎我应该能够这样做,尽管它不起作用:

<xsl:template match="word/item">
    <xsl:if test="$item-ids[.=@abg:id]">
        <xsl:message>It matches!</xsl:message>
    </xsl:if>
</xsl:template>

这是我一直忘记并不得不重新学习的东西。任何人都可以解释为什么它会这样工作吗?谢谢。

4

3 回答 3

2

要了解 XPath,您需要了解上下文节点的概念。像@id 这样的表达式正在选择上下文节点的属性。并且上下文节点在方括号内发生变化。

于 2013-01-10T16:08:55.520 回答
1

在这种情况下,您不必使用变量。在这里您可以使用:

<xsl:template match="word/item">
    <xsl:if test="$item-ids[. = current()/@abg:id]">
        <xsl:message>It matches!</xsl:message>
    </xsl:if>
</xsl:template>

您不能只使用的原因$item-ids[. = @abg:id]是,在 中,您处于(在这种情况下)[]之前的任何内容的上下文中,因此将被视为,这不是您想要的。[]$item-ids@abg:id$item-ids/@abg:id

current()指的是当前上下文之外<xsl:if>所以current()/@abg:id应该反映你想要的值。

于 2013-01-10T16:07:03.103 回答
0

我认为这是因为线

<xsl:if test="$item-ids[.=@abg:id]">

将 的值$item-ids与字符串 '@abg:id' 进行比较 - 您需要将其与值进行比较,@abg:id这就是为什么您需要将该值选择到$id变量中以使测试工作的原因。

这些帮助有用?

编辑:我误解了这个问题 - 其他答案比我的要好。

于 2013-01-10T16:02:27.983 回答