Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpath 查找只有一个其他类型子元素的元素_Xpath - Fatal编程技术网

Xpath 查找只有一个其他类型子元素的元素

Xpath 查找只有一个其他类型子元素的元素,xpath,Xpath,我想使用XPath查找至少有一个子元素的每个元素 <body><div><!-- arbitrary nesting --> <blockquote><pre>YES</pre></blockquote> <blockquote><p>NO</p></blockquote> <blockquote><pre>NO</pre&

我想使用XPath查找至少有一个子元素的每个
元素
<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>
有没有更好的(更少的代码、更高效、更干练的)方法来选择我想要的内容?

使用

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

这只是:)的一个应用程序

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

基于XSLT的验证


在提供的XML文档上应用此转换时:


对
没有

NONO

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


对
对
对

我认为不需要它们。
//blockquote[pre][not(*[not(name()="pre")])]
//blockquote[pre][count(pre)=count(*)]
//blockquote[* and not(*[not(self::pre)])]
<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>
<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>
<blockquote>
   <pre>YES</pre>
</blockquote>
<blockquote>
   <pre>YES</pre>
   <pre>YES</pre>
</blockquote>