2013-12-17 2 views
1

У меня все еще проблема с сортировкой xml по XQuery.Использование XQuery с порядком по всем элементам и атрибуту

Пожалуйста, проверьте ниже код.

Как:

<Main name = "test"> 
    <Sample id="1"> 
     <cal> 
     <tree abc="123"/> 
     <tree abc="789/> 
     <tree-order abc="456/> 
     </cal> 
    </Sample> 

    <Sample id="2"> 
     <cal> 
     <tree abc="123"/> 
     <tree abc="789/> 
     <tree-order abc="456/> 
     </cal> 
    </Sample> 

    <Sample id="3"> 
     <cal> 
     <tree abc="123"/> 
     <tree abc="789/> 
     <tree-order abc="456/> 
     </cal> 
    </Sample> 

</Main> 

Я хочу заказать по атрибуте "ABC"

Чтобы быть 1:

<Main name = "test"> 
    <Sample id="1"> 
     <cal> 
     <tree abc="123"/> 
     <tree-order abc="456/> 
     <tree abc="789/> 
     </cal> 
    </Sample> 

    <Sample id="2"> 
     <cal> 
     <tree abc="123"/> 
     <tree-order abc="456/> 
     <tree abc="789/> 
     </cal> 
    </Sample> 

    <Sample id="3"> 
     <cal> 
     <tree abc="123"/> 
     <tree-order abc="456/> 
     <tree abc="789/> 
     </cal> 
    </Sample> 
</Main> 

после того, можно ли удалить атрибут ??

Финал.

<Main name = "test"> 
    <Sample id="1"> 
     <cal> 
     <tree /> 
     <tree-order /> 
     <tree /> 
     </cal> 
    </Sample> 

    <Sample id="2"> 
     <cal> 
     <tree /> 
     <tree-order /> 
     <tree /> 
     </cal> 
    </Sample> 

    <Sample id="3"> 
     <cal> 
     <tree /> 
     <tree-order /> 
     <tree /> 
     </cal> 
    </Sample> 
</Main> 

такой.

поэтому атрибут abc предназначен для сортировки.

Я попытался нравится этот

select @data.query('for $j in * order by number($j/@abc) return $j ') 

, то это покажет формат XML без сортировки.

Есть ли способ решить эту проблему?

+1

Я редактировал свой титул. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+1

Вы правы. Спасибо за ваш совет! –

+1

Возможный дубликат [SQL Server: для управления сортировкой XML по атрибуту] (http://stackoverflow.com/questions/20613146/sql-server-for-xml-sorting-control-by-attribute) – wst

ответ

0

Обработать XML рекурсивно, так что вы можете выполнить сортировку элементных детей <cal> и сохранить его предок структуру:

declare function local:sort(
    $xml as element(cal) 
) as element() 
{ 
    element cal { 
    for $e in $xml/* 
    order by $e/@abc 
    return local:dispatch($e) 
    } 
}; 

declare function local:remove-atts(
    $xml as element() 
) as element() 
{ 
    element { node-name($xml) } { 
    $xml/@* except $xml/@abc, 
    $xml/node() 
    } 
}; 

declare function local:dispatch(
    $xml as element() 
) as element() 
{ 
    typeswitch ($xml) 
    case element(cal) return local:sort($xml) 
    case element(tree) return local:remove-atts($xml) 
    case element(tree-order) return local:remove-atts($xml) 
    default return local:process($xml) 
}; 

declare function local:process(
    $xml as element() 
) as element() 
{ 
    element { node-name($xml) } { 
    $xml/@*, 
    for $n in $xml/node() 
    return local:dispatch($n) 
    } 
}; 

local:process($xml) 
+1

Привет, спасибо за ваш ответ, Это немного смутно. как я могу получить результат выбора как select @ data.query ('for $ j in * order by number ($ j/@ abc) return $ j'), как эта функция @data, чтобы получить

tree –

+0

К сожалению, поддержка XQuery в SQL Сервер очень ограничен, поэтому похоже, что вам нужно будет создавать обертки UDF для каждой из функций XQuery, определенных здесь. Тогда вы могли бы просто вызвать 'process' UDF. Надеюсь, это поможет! – wst

+1

Я вижу, но функция объявления не работает, они сказали, что синтаксис Incorret рядом с ключевым словом «function» –

 Смежные вопросы

  • Нет связанных вопросов^_^