【问题标题】:xpath 1.0 first and last nodesxpath 1.0 第一个和最后一个节点
【发布时间】:2015-07-22 12:06:12
【问题描述】:

如何使用 xpath 1.0 语句仅选择第一个和最后一个节点?

Vehicle/Car[position() = 1] 工作正常

Vehicle/Car[position() = last] 工作正常

但是,当我尝试将它们放在一起时,它只会带回第一个结果而忽略第二个条件。 我已经厌倦了我认为应该工作的东西:

Vehicle/Car[position() = 1 or position() = last()]

但这只会带回第一个位置。

我也尝试过以下替代方法:

Vehicle/Car[position() = 1][position() = last()]

它们似乎只返回第一个而不是第一个和最后一个。

已根据要求添加*示例输入和输出。

输入示例:

<Vehicle>
    <Car>
        <CarNumber>123</CarNumber>
    </Car>
    <Car>
        <CarNumber>456</CarNumber>
    </Car>
    <Car>
        <CarNumber>789</CarNumber>
    </Car>
</Vehicle>

预期输出:

123789

实际输出:

123

xslt:

<xsl:template match="/">
    <xsl:value-of select="Vehicle/Car[position() = 1 or position() = last()]"/>
</xsl:template>

【问题讨论】:

  • 你的第一个代码运行良好
  • 我制作 xml &lt;Vehicle&gt; &lt;Car&gt;Opel&lt;/Car&gt; &lt;Car&gt;Mazda&lt;/Car&gt; &lt;Car&gt;Chevrolet&lt;/Car&gt; &lt;/Vehicle&gt; xpath 返回 Element='&lt;Car&gt;Opel&lt;/Car&gt;' Element='&lt;Car&gt;Chevrolet&lt;/Car&gt;'
  • 请在您的xpath 问题中包含示例XML
  • 如果您使用的是 XSLT-1.0,并且此 xpath 位于 xsl:value-of 中,它只会为您提供第一个值。尝试使用 XSLT-2.0 并期待这两个值。
  • @gardni 请向我们展示输入、预期输出和完整代码。

标签: xml xslt xpath


【解决方案1】:

代替:

<xsl:template match="/">
    <xsl:value-of select="Vehicle/Car[position() = 1 or position() = last()]"/>
</xsl:template>

尝试:

<xsl:template match="/">
    <xsl:for-each select="Vehicle/Car[position() = 1 or position() = last()]">
        <xsl:value-of select="."/>
    </xsl:for-each>
</xsl:template>

如前所述,在 XSLT 1.0 中,xsl:value-of 仅返回所选节点集中第一个节点的值。

【讨论】:

    【解决方案2】:

    这个表达式

    Vehicle/Car[position() = 1 or position() = last()]
    

    是正确的。我怀疑问题在于您如何使用结果。也许您正在使用像 xsl:value-of 这样的构造,它(在 XSLT 1.0 中)丢弃除第一个之外的所有元素。

    【讨论】:

    • 这看起来像是我遇到的问题,因为我在 xslt 中测试我的 xpath。 xpath语法是正确的,但是xslt有问题?
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多