【发布时间】: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')寻址到<node>。
每个milestone@xml:id 对应一个milestone@ref,作为里程碑结构的开启者和关闭者。
节点的“父”里程碑结构将由类似于
的东西标识node/preceding::milestone/concat('#',@xml:id) = node/following:milestone/@ref
此测试依赖于<node> 的上下文。它可以在 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)之前删除./。 -
我不完全确定你想做什么。您能否通过输入示例扩展问题(上下文是
<node/>元素吗?)和预期输出? -
我必须为能够在输入中读取 XPath 的应用程序准备一个导入过滤器(不幸的是,它之后会做什么)。应用程序应该在
<node/>(即它的(生成的)ID)和里程碑创建的结构之间创建一个“链接”。在给定的示例中,milestone[@xml:id='m1']将是正确的输出,milestone[@xml:id='m2']不正确。
标签: xml xpath overlap milestone