2016-07-25 3 views
2

Я новичок в XQUERY и не могу показаться, чтобы получить следующие работы:XQUERY XML разбития строки

<measInfo measInfoId="1542455297"> 
    <measTypes>1542455297 1542455298 1542455299 1542455300 1542455301 1542455302 1542455303 1542455304 1542455305 1542455306 1542455307 1542460296 1542460297 </measTypes> 
    <measValue measObjLdn="LTHAB0113422/ETHPORT:Cabinet No.=0, Subrack No.=1, Slot No.=7, Port No.=0, Subboard Type=BASE_BOARD"> 
    <measResults>116967973 585560 496041572 682500 0 12583680 72080 520454 46670568 73432 2205837 1000000 1000000 </measResults> 
    </measValue> 
    <measValue measObjLdn="LTHAB0113422/ETHPORT:Cabinet No.=0, Subrack No.=1, Slot No.=7, Port No.=1, Subboard Type=BASE_BOARD"> 
    <measResults>0 0 0 0 0 0 0 0 0 0 0 0 0 </measResults> 
    </measValue> 
</measInfo> 

Я использую // measInfo/measTypes/п: разметить (текст() '\ S +'). Я надеялся вернуть запись для каждого значения, ограниченного пространством, однако он возвращает то же самое, что и // measInfo/measTypes/text()

Что я делаю неправильно?

+0

Eh? Он возвращает запись для каждого значения, разделенного пробелом, когда я запускаю его (в BaseX). –

+0

Я использую http://www.xpathtester.com/xquery, чтобы проверить код, какой сайт вы используете? – user1854326

+0

Не сайт, (загружаемая, устанавливаемая) база данных XQuery (с очень приятным графическим интерфейсом): http://basex.org/. BaseX остается очень близким к передней границе стандарта XQuery во время его процесса разработки, поэтому он хорошо подходит как тестовая платформа для текущих версий языка. –

ответ

1

В XQuery 3.0 (реализуемое Basex), это на самом деле делает работы:

declare context item := document { 
<measInfo measInfoId="1542455297"> 
<measTypes>1542455297 1542455298 1542455299 1542455300 1542455301 1542455302 1542455303 1542455304 1542455305 1542455306 1542455307 1542460296 1542460297 </measTypes> 
<measValue measObjLdn="LTHAB0113422/ETHPORT:Cabinet No.=0, Subrack No.=1, Slot No.=7, Port No.=0, Subboard Type=BASE_BOARD"> 
    <measResults>116967973 585560 496041572 682500 0 12583680 72080 520454 46670568 73432 2205837 1000000 1000000 </measResults> 
</measValue> 
<measValue measObjLdn="LTHAB0113422/ETHPORT:Cabinet No.=0, Subrack No.=1, Slot No.=7, Port No.=1, Subboard Type=BASE_BOARD"> 
    <measResults>0 0 0 0 0 0 0 0 0 0 0 0 0 </measResults> 
</measValue> 
</measInfo> 
}; 

for $item in //measInfo/measTypes/fn:tokenize(text(),'\s+') 
return <item>{$item}</item> 

... возвращается ...

<item>1542455297</item> 
<item>1542455298</item> 
<item>1542455299</item> 
<item>1542455300</item> 
<item>1542455301</item> 
<item>1542455302</item> 
<item>1542455303</item> 
<item>1542455304</item> 
<item>1542455305</item> 
<item>1542455306</item> 
<item>1542455307</item> 
<item>1542460296</item> 
<item>1542460297</item> 
<item/> 

Ввод <item> вокруг каждого результата гарантирует, что рендеринг этих результатов делает каждый элемент визуально отличным - в противном случае вы можете получить каждый результат, оказанный в одну строку текста, и это wo не было очевидно для читателя, были ли они разбиты на несколько элементов на fn:tokenize() или нет.


Другой способ сделать это, чтобы ввести символы новой строки:

for $item in //measInfo/measTypes/fn:tokenize(text(),'\s+') 
return ($item, "&#10;") 
+0

Yahoo, что работает, что вы так много – user1854326

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