Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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
Xml 用于检查节点是否至少包含一个非空子节点的XSL/XPath表达式_Xml_Xslt_Xpath - Fatal编程技术网

Xml 用于检查节点是否至少包含一个非空子节点的XSL/XPath表达式

Xml 用于检查节点是否至少包含一个非空子节点的XSL/XPath表达式,xml,xslt,xpath,Xml,Xslt,Xpath,我需要检查XML节点是否至少有一个非空子节点。应用于此XML时,表达式应返回true <xml> <node> <node1/> <node2/> <node3>value</node3> </node> </xml> 价值 我尝试使用这个表达式:,但它似乎检查所有的子项是否都是空的 如果至少有一个元素不为空,如何编写返回true的表达式

我需要检查XML节点是否至少有一个非空子节点。应用于此XML时,表达式应返回
true

<xml>
    <node>
       <node1/>
       <node2/>
       <node3>value</node3>
    </node>
</xml>

价值
我尝试使用这个表达式:
,但它似乎检查所有的子项是否都是空的

如果至少有一个元素不为空,如何编写返回
true
的表达式?有没有一种方法可以做到这一点,而无需创建另一个模板来迭代节点子节点

UPD:我正在考虑计算非空节点,如
test=“计数(不是(/xml/node/child::*=”)“0”


但不知怎么的,就是不能让它正常工作。此表达式的格式不正确。

这里有一个XPath可以完成此任务:

count(/*/node/*[text()]) &gt; 0
在示例XSLT中使用时:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
     <xsl:value-of select="count(/*/node/*[text()]) &gt; 0" />
  </xsl:template>

</xsl:stylesheet>
<xml>
  <node>
    <node1/>
    <node2/>
    <node3>value</node3>
  </node>
</xml>
true
<xml>
  <node>
    <node1/>
    <node2/>
    <node3/>
  </node>
</xml>
false
  /*/node/*[normalize-space()]
如果我们对简单修改的XML应用相同的XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
     <xsl:value-of select="count(/*/node/*[text()]) &gt; 0" />
  </xsl:template>

</xsl:stylesheet>
<xml>
  <node>
    <node1/>
    <node2/>
    <node3>value</node3>
  </node>
</xml>
true
<xml>
  <node>
    <node1/>
    <node2/>
    <node3/>
  </node>
</xml>
false
  /*/node/*[normalize-space()]
说明:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
     <xsl:value-of select="count(/*/node/*[text()]) &gt; 0" />
  </xsl:template>

</xsl:stylesheet>
<xml>
  <node>
    <node1/>
    <node2/>
    <node3>value</node3>
  </node>
</xml>
true
<xml>
  <node>
    <node1/>
    <node2/>
    <node3/>
  </node>
</xml>
false
  /*/node/*[normalize-space()]
使用的XPath搜索具有非空文本值(由
text()
指定)的
元素的所有子元素(这些子元素又是根元素的子元素);如果此类
子级的计数大于0,则XPath解析为
true

,您只需要

在XPath中,
=
=比较,其中一边是节点集,另一边是字符串,如果集中的任何节点通过比较,则比较成功。因此

not(x = '')
表示“当前节点的任何
x
子元素都没有空字符串值”,这与

x != ''
这意味着“当前节点的至少一个子元素的字符串值不是空的”。特别是,如果要检查所有
x
子项是否为空,则需要使用“双阴性”测试


更准确、更简单、更高效(无需使用
count()
函数)

  /*/node/*[text()]
如果要排除任何只包含纯空白文本子元素的元素,请使用:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
     <xsl:value-of select="count(/*/node/*[text()]) &gt; 0" />
  </xsl:template>

</xsl:stylesheet>
<xml>
  <node>
    <node1/>
    <node2/>
    <node3>value</node3>
  </node>
</xml>
true
<xml>
  <node>
    <node1/>
    <node2/>
    <node3/>
  </node>
</xml>
false
  /*/node/*[normalize-space()]

解释
这将找到字符串长度大于零的第一个节点,然后将此类节点内容与空字符串进行比较(比较将返回非空字符串节点的存在);此代码还可用于在任何节点中查找特定条件,例如,确定是否存在包含特定字符串或以某个字符或任何其他条件开头的节点;请使用此作为节点引用的内部条件,以便代码发挥其魔力。

噢,
text()
。。我知道我错过了什么!谢谢。这是一个宝贵的编程知识,可以帮你省下几个小时的压力。你知道我如何测试“如果没有一个孙子<代码>术语(不管父元素叫什么)包含字符串<代码>”,“”?我尝试了
record[not(contains(*/*/term,,)]
,但它匹配了第一个
术语没有
,第二个没有
(逻辑上似乎忽略了any/none方面)的记录。