2011-09-13 24 views
1

比方說,我有XML結構這樣如何找出什麼是「一把手」的XML元素的我指定

<root> 
    <element>some content</element> 
    <element>some content 2</element> 
    <element>some content 3</element> 
    <element>some content 4</element> 
    <element>some content 5</element> 
    <element>some content 6</element> 
    <element>some content 7</element> 
    <element>some content 8</element> 
    <element>some content 9</element> 
    <element>some content 10</element> 
</root> 

我有足夠的根標籤,讓我們說1000,和他們每個人包含不同的數據當然(不唯一),我的問題是...如何找出元素的數量,例如,如果我與元素「一些內容8」的工作,我想得到8號,我知道xpath可能是正確的工具,但它對我來說似乎很慢(我想在幾秒鐘內就這樣做,因爲我經常使用它)

也許某些「vim」方式如何做到這一點?

謝謝

+0

好問題,1。是的,這對於XPath來說很容易和自然。 –

回答

2

你可以指望從可能發生的<element>替代物的所有時間首先到當前行:

:0,.s/<element>//gn 

請注意,n標誌防止實際發生的替代。

這顯然不適合所有可以想象類型的XML的工作,但可能適合你的數據。

+0

Precies笏IK王爾德zeggen(我正要說) – sehe

+1

或者更好,'? ?,S/ // gn'(在情況下,如果有另一基團的'單曲高於''。 –

0

要從你可以在vim使用以下ex命令當前行拉出數:

:echo substitute(getline('.'), '.*\(\d\+\).*', '\1', '') 
+0

問題是elemens的文本不包含數字,那只是爲示範,對不起了混亂 –

0

一個純粹的XPath的解決方案

count(/*/element[. = 'some content 8']/preceding-sibling::*) +1 

爲了驗證這一點很容易,你可以使用像XPath Visualizer的工具,或以下基於XSLT的驗證:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "count(/*/element[. = 'some content 8']/preceding-sibling::*) +1"/> 
</xsl:template> 
</xsl:stylesheet> 

當這個轉換是在提供的XML文檔上執行的:

<root> 
    <element>some content</element> 
    <element>some content 2</element> 
    <element>some content 3</element> 
    <element>some content 4</element> 
    <element>some content 5</element> 
    <element>some content 6</element> 
    <element>some content 7</element> 
    <element>some content 8</element> 
    <element>some content 9</element> 
    <element>some content 10</element> 
</root> 

從評估XPath表達式的結果被輸出,並且它是正確的

8 
相關問題