子串

2012-09-19 30 views
2

請考慮此示例文件:http://www.w3schools.com/dom/books.xml子串

這個XPath表達式//title/text(),返回:

日常意大利
哈利波特
XQuery的腳啓動
學習XML

現在我只想要名字,和嘗試:tokenize(//title/text(),' ')[1],它返回:

項目過多

OTOH tokenize((//title/text())[1],' ')[1]返回第一個節點名字。

如何在迭代節點時獲取帶有XPath的子字符串?

+0

THETA,是我的回答對你有用或者你還有什麼問題嗎?您是否注意到它至少比當前接受的答案短兩倍,效率更高? –

+0

關於迪米特雷。感謝您的額外答覆(我投了票),以及包含的提示和進一步的解釋。這是非常有用的,我希望其他人也會很快投票。我已經標記了Cylian的答案是正確的,因爲它向我展示了這個錯誤,並且引導我'// title/tokenize(text(),'')[1]'解決方案,這對我的問題來說是完美的。乾杯 – theta

回答

1

試試這個

1。要獲得除最後一個所有部分使用:

//title/string-join(tokenize(.,'\s+')[position() ne last()],' ') 

2.只得到第一個使用這個:

//title/string-join(tokenize(.,'\s+')[position() eq 1],' ') 

希望這會有所幫助。

+0

啊,謝謝,這給了我線索。所以函數不應該在整個XPath表達式中調用,而應該在部分返回文本上調用。然而,這要簡單得多:'// title/tokenize(text(),'')[1]',它的效果很好。歡呼聲 – theta

+0

不客氣! – Cylian

2

使用

//text()/tokenize(.,' ')[1] 

這將產生XML文檔中的每個文本節點的第一個 「字」 的序列。

XSLT 2.0 - 基於驗證

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:sequence select="//text()/tokenize(.,' ')[1]"/> 
</xsl:template> 
</xsl:stylesheet> 

當在下面的XML文檔被應用於這種轉變:

<t> 
    <a>Everyday Italian</a> 
    <b>Harry Potter</b> 
    <c>XQuery Kick Start</c> 
    <d>Learning XML</d> 
</t> 

XPath表達式求值並在此結果評估被複制到輸出:

Everyday 
Harry 
XQuery 
Learning 

以上內容僅包含一些僅限空格的文本節點。

如果你想忽略任何只有空白文本節點,改變XPath表達式

//text()[normalize-space()]/tokenize(.,' ')[1]