5

XPath を使用<blockquote>して、少なくとも 1 つの子<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) 方法はありますか?

4

2 に答える 2

5
//blockquote[pre][count(pre)=count(*)]
于 2012-07-11T19:28:16.713 に答える
3

使用

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

blockquoteこれにより、少なくとも1つの要素の子があり、要素ではない要素の子がないXMLドキュメント内のすべての要素が選択されpreます。

これは、二重否定法の単なる適用です:)。

この式は、すべての要素の子をカウントする式よりも効率的であることに注意してください(子以外の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>
于 2012-07-12T12:50:26.200 に答える