【问题标题】:Finding a preceding node that corresponds to a following node with XPath only仅使用 XPath 查找与后续节点相对应的前面节点
【发布时间】:2013-06-18 17:47:25
【问题描述】:

我有一个与普通 XML 交织在一起的“里程碑”标记:

<root>
   <milestone type="opener" xml:id="m1" />
   text
      <milestone type="opener" xml:id="m2"/>
          text
      <milestone type="closer" ref="#m2"/>  
      text
      <node>
         text
      </node>
      ... 
   <milestone type="closer" ref="#m1"/>
</root>

并希望使用 XPath 将“父级”里程碑结构(即milestone@xml:id='m1')寻址到&lt;node&gt;

每个milestone@xml:id 对应一个milestone@ref,作为里程碑结构的开启者和关闭者。

节点的“父”里程碑结构将由类似于

的东西标识
node/preceding::milestone/concat('#',@xml:id) = node/following:milestone/@ref

此测试依赖于&lt;node&gt; 的上下文。它可以在 XSLT 中实现,例如

<xsl:template match="node">
  <xsl:variable name="me" select="."/>
  <xsl:value-of select="./preceding::milestone[
       ./concat('#',@xml:id) =
       $me/following::milestone/@ref
    ][1]/@xml:id" />
</xsl:template>

但我不知道如何使用纯 XPath 来做到这一点。

有什么建议吗?

【问题讨论】:

  • 顺便说一下,要让您在上面的示例工作,您必须在 concat('#',@xml:id) 之前删除 ./
  • 我不完全确定你想做什么。您能否通过输入示例扩展问题(上下文是 &lt;node/&gt; 元素吗?)和预期输出?
  • 我必须为能够在输入中读取 XPath 的应用程序准备一个导入过滤器(不幸的是,它之后会做什么)。应用程序应该在&lt;node/&gt;(即它的(生成的)ID)和里程碑创建的结构之间创建一个“链接”。在给定的示例中,milestone[@xml:id='m1'] 将是正确的输出,milestone[@xml:id='m2'] 不正确。

标签: xml xpath overlap milestone


【解决方案1】:

将变量$me 替换为current()

【讨论】:

  • current() 是 XSLT-only,用户要求纯 XPath 解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 2011-02-06
  • 2019-04-11
相关资源
最近更新 更多