在SQL Server中计算XML中的非空节点

时间:2018-01-23 13:41:26

标签: sql sql-server xml

我需要计算非空的所有 b 节点(因此结果应为2)。

function printScriptTextContent(script)
{
  var xhr = new XMLHttpRequest();
  xhr.open("GET",script.src)
  xhr.onreadystatechange = function () {
    if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
      console.log("the script text content is",xhr.responseText);
    }
  };
  xhr.send();
}
Array.prototype.slice.call(document.querySelectorAll("script[src]")).forEach(printScriptTextContent);

我正在使用下面的代码,但这会返回所有节点的计数(包括空)。

<a>
  <b>1</b>
  <b/>
  <b>g</b>
</a>

3 个答案:

答案 0 :(得分:2)

对不起,这不是答案!我完全误解了这一点,并认为你正在寻找空节点。 GarethD已经给出了一个合适的答案(同样的想法,反之亦然)。

我不会删除它,因为它可能会帮助其他人......

空元素<b/>(与<b></b>相同)已存在,但没有text()

DECLARE @xml XML = 
N'<a>
  <b>1</b>
  <b/>
  <b></b>
  <b>g</b>
</a>';

select @xml.value('count(/a/b[empty(text())])', 'int')

这会返回2,因为有<b/><b></b>

为了完整起见,你可能会否定谓词,这实际上是你需要的结果:

select @xml.value('count(/a/b[not(empty(text()))])', 'int')

答案 1 :(得分:2)

如果您使用的是//a/b/text()而不只是//a/b,那么您的计数为2

DECLARE @x XML= '<a><b>1</b><b/><b>g</b></a>';
SELECT @x.value('count(//a/b/text())', 'int');

答案 2 :(得分:1)

使用此XPath表达式

count(/a/b[normalize-space(text())=''])

在您的代码中加入它看起来像这样:

select top 1  rc.XmlContent.value('count(/a/b[normalize-space(text())=""])', 'int') from Table rc
相关问题