【问题标题】:XPath relative to variable's location in source documentXPath 相对于源文档中变量的位置
【发布时间】:2012-02-12 19:02:22
【问题描述】:

当遍历节点集变量中的节点时,我想要一个 XPATH 1.0 表达式,它返回节点的所有祖先(例如,$myVariable[7])——不是节点集变量中的祖先,而是原始文档中的祖先。

我认为其中一个会起作用,但也不会。

select="//*[generate-id()=generate-id($myVariable[7])]/ancestor::*"
select="id(generate-id($myVariable[7]))/ancestor::*"

我接近了吗?

编辑:这不是我问题的核心,但我有//ancestor;多余的斜线是不必要的。

【问题讨论】:

  • 您是否愿意接受涉及 Xalan 扩展功能的非 xsl 解决方案,例如(如果您使用 Java 进行转换)?或者您正在使用什么转换技术?
  • 转换是在浏览器中完成的,所以只有节点集扩展的 XSLT 1.0。

标签: xslt xpath


【解决方案1】:

你的表情

//*[generate-id()=generate-id($myVariable[7])]/ancestor::*

是正确的

它“不工作”的原因可能是因为$myVariable[7] 不包含您所期望的。

这是一个使用上述表达式并产生预期结果的简单完整示例。正确结果

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="myVariable"
      select="/*/*/*/*/num"/>

 <xsl:template match="/">
  <xsl:for-each select=
  "//*[generate-id()
      =
       generate-id($myVariable[7])
       ]
        /ancestor::*
  ">
    <xsl:value-of select="name()"/>
    <xsl:text>&#xA;</xsl:text>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档时

<a>
    <b>
        <c>
            <nums>
                <num>01</num>
                <num>02</num>
                <num>03</num>
                <num>04</num>
                <num>05</num>
                <num>06</num>
                <num>07</num>
                <num>08</num>
                <num>09</num>
                <num>10</num>
            </nums>
        </c>
    </b>
</a>

产生想要的正确结果($myVariable[7] 的所有祖先的名字)

a
b
c
nums

【讨论】:

  • 你是对的。我不是用 select 而是用 copy-of 创建了变量,所以它毕竟不是原始节点。谢谢迪米特!你让我找对地方了。 +1,Q 已回答。
猜你喜欢
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
相关资源
最近更新 更多