2016-07-25 23 views
2

ich xQuery bin neu und kann nicht scheinen die folgenden zur Arbeit zu kommen:xQuery XML tokenize einen String

<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> 

Ich verwende // measInfo/measTypes/fn: tokenize (text() , '\ s +'). Ich hatte gehofft, würde für jeden durch Leerzeichen begrenzten Wert einen Datensatz zurückgeben, aber es gibt dasselbe zurück wie // measInfo/measTypes/text()

Was mache ich falsch?

+0

Eh? Es gibt einen Datensatz für jeden durch Leerzeichen getrennten Wert zurück, wenn ich ihn (in BaseX) ausführe. –

+0

Ich verwende http://www.xpatestester.com/xquery, um den Code zu testen, welche Site verwenden Sie? – user1854326

+0

Keine Site, eine (herunterladbare, installierbare) XQuery-Datenbank (mit einer sehr schönen GUI): http://basex.org/. BaseX bleibt während des Entwicklungsprozesses ziemlich nah an der Spitze des XQuery-Standards und eignet sich daher gut als Testplattform für aktuelle Versionen der Sprache. –

Antwort

1

In XQuery 3.0 (wie von BaseX implementiert), die eigentlich tut Arbeit:

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> 

... kehrt ...

<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> jedes Ergebnis um Einlochen stellt sicher, dass das Rendern dieser Ergebnisse jedes Objekt visuell unterscheidbar macht - andernfalls könnte jedes Ergebnis in einer einzelnen Textzeile gerendert werden Für den Leser ist es nicht offensichtlich, ob sie von fn:tokenize() in mehrere Artikel aufgeteilt wurden oder nicht.


Ein anderer Weg, dies zu tun ist wörtliche Zeilenumbrüche zu injizieren:

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

Yahoo ,, Das funktioniert, dass du so viel – user1854326