如何找出我指定的xml元素的“数量”

时间:2011-09-13 10:38:39

标签: xml vim xpath

假设我有像这样的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,而且每个标签当然包含不同的数据(不是唯一的),我的问题是......如何查找元素数量的最快方法是什么,例如,如果我使用元素“some content 8”我想得到8号,我知道xpath可能是正确的工具,但在我看来它很慢(我想在几秒钟内做到这一点,因为我经常使用它)

也许有些“vim”方式怎么做?

谢谢

3 个答案:

答案 0 :(得分:2)

您可以计算<element>的替代品从第一行到当前行的所有时间:

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

请注意,n标志会阻止替换实际发生。

这显然不适用于所有可能的XML类型,但可能适合您的数据。

答案 1 :(得分:0)

要从当前行中提取数字,您可以在vim中使用以下ex命令:

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

答案 2 :(得分: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