【问题标题】:Can I build this XPath query dynamically in XSLT?我可以在 XSLT 中动态构建这个 XPath 查询吗?
【发布时间】:2010-03-21 06:18:24
【问题描述】:

我有一个看起来像这样的文档

<root>
    <element>
        <subelement1 />
        <subelement2 />
    </element>
    <element>
        <subelement2 />
        <subelement1 />
    </element>
</root>

/element[2]/[someNode] 上下文中的我的XSLT 工作表中,我想获得一个表示/element[1]/[someNode] 距离的数字(即/element1/[someNode] 的前面兄弟姐妹的数量)。例如,在/element[2]/subelement1 的上下文中,我想有一些方法来获得数字2,即从/element[1]/element[1]/subelement2 的距离。我只需要给定节点名称与&lt;element&gt; 的第一个实例的距离。

直觉上我认为我可以像这样构造它

 <xsl:variable name="nodename" select="name()" />
 <xsl:value-of select="/element[1]/$nodename/preceding-sibling::*" />

但不幸的是,此工作表无法编译。我想要在 XSLT 中实现的目标是否可行?

【问题讨论】:

  • 您的示例似乎不一致:在/element[2]/[someNode] 的上下文中,您想找到/element[1]/[someNode]/element[2]/subelement1 中的示例一样,您想找到从/element[1]/element[1]/subelement2 的距离 - 所以[someNode] 这里是 subelement2 还是 subelement1?

标签: xml xslt xpath


【解决方案1】:
  1. 不能将 XSLT 变量用作 XPATH 语句的轴,但可以在谓词过滤器中使用它。因此,如果您要匹配任何元素(即 *),然后将其限制为 name() 等于存储在变量中的值(即 *[name()=$nodename])的元素,则 XPATH 将有效。

  2. 您正在构建的 XPATH 将返回匹配元素的值。如果要返回有多少元素与该模式匹配,可以使用count() 函数。

  3. 您的示例 XML 有一个文档元素 &lt;root&gt;,但您的 XPATH 不包括 &lt;root&gt;

这使用上下文节点分配的变量返回前兄弟元素的数量:

<xsl:variable name="nodename" select="name()" />
<xsl:value-of select="count(/root/element[1]/*[name()=$nodename]/preceding-sibling::*)" />

您可以消除变量并使用:

<xsl:value-of select="count(/root/element[1]/*[name()=name(current())]/preceding-sibling::*)" />

【讨论】:

    【解决方案2】:

    *[name() = $nodename] 可能是您想要的,而不是 $nodename 但您应该更好地定义两个变量,其值为 local-name() 和 namespace-uri() 并检查例如*[local-name() = $localname and namespace-uri() = $namespaceuri] 使用命名空间安全的方式来选择元素。

    【讨论】:

      【解决方案3】:

      不幸的是,构建 xpath 是不可能的。 XPath 是静态编译的;你不能即时生成它们(或者如果你这样做,它们只是字符串并且无法执行)。

      但是,您可以做的是编写一个查询,该查询恰好交叉引用了几个本身是动态的值...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-23
        • 2021-11-10
        • 2011-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多