如何计算sql中两个节点之间的公共节点

时间:2016-09-17 11:04:28

标签: html sql xpath xquery sql-server-2014

如何计算sql中两个节点之间的公共节点:

<li><h2 id="vgn">VGN A </h2>之间计算<h2 id="vgn">VGN </h2>个代码以及<h2>代码的数量。

换句话说:在这个例子中,h2 number1和h2 number 2之间的li计数。

<table class="table table-condensed table-no-border table-brand-main">
    <tr><td><h2 id="vgn">VGN A </h2></td></tr>
    <tr><td>
    <style>
        ul.brand_572 {
                 -moz-column-count: 6;
              -webkit-column-count: 6;
                      column-count: 6;
            }
        ul.brand_572 li
        {
            width:120px;
        }
        /*ul.brand_572 li a.product-title
        {
            width:120px;
        }*/
    </style>
    <ul class="specialclass brand_572">        
        <li>
            <a href="sony-vgn-ar290g-battery-6cells-4400mah-11-1v.html">Sony  VGN-AR290G </a>
        </li>    
        <li>
            <a href="sony-vgn-ar290g-battery-6cells-4400mah-11-1v.html">Sony  VGN-AR290G </a>
        </li>    
        <li>
            <a href="sony-vgn-ar290g-battery-6cells-4400mah-11-1v.html">Sony  VGN-AR290G </a>
        </li>    
        <li>
            <a href="sony-vgn-ar290g-battery-6cells-4400mah-11-1v.html">Sony  VGN-AR290G </a>
        </li>    
        <li>
            <a href="sony-vgn-ar290g-battery-6cells-4400mah-11-1v.html">Sony  VGN-AR290G </a>
        </li>    
        <li>
            <a href="sony-vgn-ar290g-battery-6cells-4400mah-11-1v.html">Sony  VGN-AR290G </a>
        </li>    
        <li>
            <a href="sony-vgn-ar290g-battery-6cells-4400mah-11-1v.html">Sony  VGN-AR290G </a>
        </li>    
    </ul>
    </td>
    </tr>
    <tr><td><h2 id="vgn">VGN </h2></td></tr>
    <tr><td>
        <ul class="specialclass brand_572">        
            <li>
                <a href="sony-vgn-ar290g-battery-6cells-4400mah-11-1v.html">Sony  VGN-AR290G </a>
            </li>    
            <li>
                <a href="sony-vgn-ar290g-battery-6cells-4400mah-11-1v.html">Sony  VGN-AR290G </a>
            </li>    
            <li>
                <a href="sony-vgn-ar290g-battery-6cells-4400mah-11-1v.html">Sony  VGN-AR290G </a>
            </li>    
            <li>
                <a href="sony-vgn-ar290g-battery-6cells-4400mah-11-1v.html">Sony  VGN-AR290G </a>
            </li>    
            <li>
                <a href="sony-vgn-ar290g-battery-6cells-4400mah-11-1v.html">Sony  VGN-AR290G </a>
            </li>    
            <li>
                <a href="sony-vgn-ar290g-battery-6cells-4400mah-11-1v.html">Sony  VGN-AR290G </a>
            </li>    
        </ul>
    </td></tr>
</table>

预期产出:

count of li  between h2 and h2
      7              1      2

c.li = no.h2 1,2之间的

1 个答案:

答案 0 :(得分:1)

您现在已经提出了三个问题,所有问题都与您希望使用T-SQL解决的HTML问题有关。

As I told you before

T-SQL不适合您的问题!

我告诉过你,你对XML 有一种深刻的误解。你已经完成了这件事:你用xml标记了你的问题。 但这不是XML(即使它看起来像)!这是HTML!

SQL Server为XML提供了很好的支持,但它不是HTML的正确工具。使用HTML解析器或任何过程语言自己编写解析算法。

只是给你一个想法,为什么SQL Server不是正确的工具:

在你的特殊情况下 - 但是你永远不能依赖这个!!! - 你的HTML是有效的XML。在这种情况下 - 并且仅在这种情况下! - 可以考虑XQuery。在<li>元素之后计算<h2> - 元素可能如下所示:

DECLARE @s VARCHAR(MAX)='Your HTML here';
DECLARE @xml XML=CAST(@s AS XML); --you'd get your first error here probably

DECLARE @H2_id VARCHAR(100)='vgn';
SELECT COUNT(*) AS CountOnThisLevel
FROM @xml.nodes('//h2[@id=sql:variable("@H2_id")]/../../../tr[2]/td/ul/li') AS A(li)

结果是7,你喜欢它......

此路径

//h2[@id=sql:variable("@H2_id")]/../../../tr[2]/td/ul/li

读起来像这样:

  

使用id-attribute搜索文档中任何位置的任何h2   等于变量“H2_id”的内容。现在移动三个级别   向上,然后取第二个<tr>,向下移动到<td>,   <ul><li>。统计你在那里找到了多少。

看起来不错,但是

  • <h2>可能是<H2>(XQuery区分大小写!)
  • HTML表格可能会使用<thead><tfoot>
  • 链中可能有<div>个标签
  • - 几乎可以肯定! - 您的真实世界 HTML无效XML
  • 还有更多原因,为什么这种做法很糟糕!

你应该转身寻找合适的工具!