【问题标题】:Avoiding using "ancestor::" Xpath axis避免使用“ancestor::” Xpath 轴
【发布时间】:2013-02-07 21:26:40
【问题描述】:

我正在尝试找到一种方法来将此转换重新工作到我不必在 Xpath 中使用 ancestor:: 轴的位置:

<xsl:template match="p[ancestor::p]">
     <xsl:apply-templates select="node() except ppr" />
</xsl:template>

来源示例:

<root>
  <p>
     <p/>
     <section>
        <p/>
     </section>
     <ppr/>
     <content/>
     <p/>
     <picture/>
  </p>
</root>

期望的输出:

<root>
  <p>
     <section>
     </section>
     <ppr/>
     <content/>
     <picture/>
  </p>
</root>

我无法使用显式 Xpath 或定位来获取这些 &lt;p&gt; 元素,因为它们的位置是随机的,并且在我的原始源文档中没有模式。

我尝试不使用ancestor:: 的原因是因为我使用的XSLT 处理器需要30-50 秒来评估该Xpath 表达式。 我不希望这个问题是关于我正在使用哪个 XSLT 处理器或我的设置的其他实现,而是关注手头的问题:有没有办法在我的上述转换中不使用 ancestor::

提前致谢。

【问题讨论】:

  • 是否要求您只使用 xslt-2.0(标签暗示了这一点)? xslt 标签意味着任何版本都可以工作。
  • @Ryan Gates,抱歉 Ryan 这有点误导,这仅适用于 XSLT-2.0。
  • 为什么不直接使用//p//p
  • @BeniBela 成功了!!谢谢!
  • 我想我应该把它作为答案发布

标签: xml xpath xslt-2.0


【解决方案1】:

原来如此简单:

//p//p

【讨论】:

  • 匹配模式中不需要前导“//”:它的唯一作用是确保“p”元素仅在它们是完整文档的一部分时才匹配,在你的情况下这个测试几乎可以肯定是多余的(而且会增加几微秒)。
猜你喜欢
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多