【问题标题】:Find an element that only has one other kind of child找到一个只有另一种子元素的元素
【发布时间】:2012-07-12 20:50:26
【问题描述】:

我想使用 XPath 来查找每个 <blockquote> 元素,其中至少有一个子 <pre> 元素,没有其他类型的子元素,并且可以选择文本节点作为子元素:

<body><div><!-- arbitrary nesting -->
  <blockquote><pre>YES</pre></blockquote>
  <blockquote><p>NO</p></blockquote>
  <blockquote><pre>NO</pre><p>NO</p></blockquote>
  <blockquote><p>NO</p><pre>NO</pre></blockquote>
  <blockquote><pre>YES</pre> <pre>YES</pre></blockquote>
  <blockquote>NO</blockquote>
</div></body>

这个 XPath 似乎可以工作,但我怀疑它过于复杂:

//blockquote[pre][not(*[not(name()="pre")])]

是否有更好(更少代码、更高效、更 DRY)的方式来选择我想要的内容?

【问题讨论】:

    标签: xpath


    【解决方案1】:
    //blockquote[pre][count(pre)=count(*)]
    

    【讨论】:

    • 我认为不需要它们。
    【解决方案2】:

    使用

    //blockquote[* and not(*[not(self::pre)])]
    

    这会选择 XML 文档中的所有 blockquote 元素,这些元素至少有一个子元素,并且没有任何不是 pre 元素的子元素。

    这只是double negation law的一个应用:)。

    请注意,此表达式比计算所有子元素的表达式更有效(因为选择会在找到非pre 子元素的那一刻停止)。

    基于 XSLT 的验证

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="/">
         <xsl:copy-of select="//blockquote[* and not(*[not(self::pre)])]"/>
     </xsl:template>
    </xsl:stylesheet>
    

    当此转换应用于提供的 XML 文档时:

    <body><div><!-- arbitrary nesting -->
          <blockquote><pre>YES</pre></blockquote>
          <blockquote><p>NO</p></blockquote>
          <blockquote><pre>NO</pre><p>NO</p></blockquote>
          <blockquote><p>NO</p><pre>NO</pre></blockquote>
          <blockquote><pre>YES</pre> <pre>YES</pre></blockquote>
          <blockquote>NO</blockquote>
    </div></body>
    

    计算 XPath 表达式并将所选节点复制到输出:

    <blockquote>
       <pre>YES</pre>
    </blockquote>
    <blockquote>
       <pre>YES</pre>
       <pre>YES</pre>
    </blockquote>
    

    【讨论】:

      猜你喜欢
      • 2018-03-19
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多