【问题标题】:how to use or statement in xsl:apply-templates select attribute?如何在 xsl:apply-templates select 属性中使用 or 声明?
【发布时间】:2011-07-28 17:22:30
【问题描述】:

我想在 xsl:apply-templates select 中使用 OR 语句匹配两个表达式。我想检查以下条件...

<xsl:apply-templates select="//w:body/w:p[w:r[w:t]] or //w:body/w:p[w:r[w:pict]]">

 // My Functionality

</xsl:apply-templates>

但我不知道我是怎么做到的。请指导我摆脱这个问题...

【问题讨论】:

  • 对不起,我添加了不正确的答案,这是“或”的正确用法(选择属性允许任何 xPath 表达式),你打算用这个条件实现什么?有什么问题?
  • @Kirill:是的,你是对的......它工作正常......
  • 您使用or 在正确的行中。看我的回答。 +1

标签: xml xpath xslt


【解决方案1】:

我不了解 XSLT 2.0,但在 XSLT 1.0 中 &lt;xsl:apply-templates select="//w:body/w:p[w:r[w:t]] or //w:body/w:p[w:r[w:pict]]"&gt; 不是有效查询。使用| 而不是or

【讨论】:

  • 正如您从我的回答中看到的那样,即使您显示的内容不正确,也有更好的方法来实现想要的结果。
  • @empo,我只回答了这个问题,没有更多... :-)
  • 在 XPath 2.0 中,您希望将其写为 //w:body/(w:p[w:r/w:t] | w:p[w:r/w:t]),即使仍然没有必要。
【解决方案2】:

您可以使用or,在这种情况下使用它确实是正确的,因为您不需要测试节点:

<xsl:apply-templates select="
  //w:body
    /w:p
    [w:r/w:t or w:r/w:pict]">

| (union) 仅在需要选择测试节点时是必不可少的w:tw:pict):

<xsl:apply-templates select="
  //w:body/w:p/w:r/w:t
  |
  //w:body/w:p/w:r/w:pict">

XPath 2.0 让你写得更简洁的地方:

<xsl:apply-templates select="
  //w:body/w:p/w:r/(w:t|w:pict)"/>

【讨论】:

  • 我认为第一个和第二个查询不相等,或者我可能弄错了?
  • 是的。他们真的很不一样。我以为我对此很清楚。第一次选择w:p,第二次选择测试节点。仔细阅读我的话;-)
  • 不过,使用//w:body/w:p[w:r[w:t]] | //w:body/w:p[w:r[w:pict]]//w:body/w:p[w:r/w:t or w:r/w:pict] 是个人喜好问题
  • 无论如何,//w:body/w:p[w:r/w:t or w:r/w:pict] 更具可读性。
  • 当然,如果是口味(或性能)问题,我无论如何都会选择这个:))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 2019-04-03
  • 2016-08-28
  • 2016-02-15
  • 1970-01-01
  • 2021-03-15
相关资源
最近更新 更多