使用Xpath从XML中选择元素

时间:2015-04-20 01:32:45

标签: xml eclipse xpath jet emf

我有一个巨大的XML文件。看起来像以下

<component name='comp1'>
  <child> ... </child>
  <child> ... </child>
  <optional id='1'> ... </optional>
</component>

<component name='comp2'>
  <child> ... </child>
  <child> ... </child>
  <optional id='1'> ... </optional>  
  <optional id='1'> ... </optional>
  <optional id='2'> ... </optional>
</component>

我想根据每个组件的ID选择可选元素,而不在同一组件中重复任何id。

简单地说,我想要comp2的以下输出,例如:

Comp2
1
2

我的问题是只选择一次具有相似id的可选元素。

我正在使用带有JET1的Xpath(java Emitter Template) 我正在迭代每个组件寻找可选元素并打印他们的文本()。但是,我的循环导致以下

 Comp2
    1
    1
    2

我想消除重复的结果。

我的JET寺庙:

<c:iterate select="//component/optional" var="Optional">
<c:get select="$Optional"/>
</c:iterate>

2 个答案:

答案 0 :(得分:0)

试试这个XPath:

//component/optional[not(@id = following-sibling::optional/@id)]

答案 1 :(得分:0)

我不知道JET支持什么,但相信这个 XPath 2.0表达式可能会为您的案例提供一个好主意

/*/component[@name eq 'comp2']/optional
             [not(@id eq preceding-sibling::*[1][self::optional]/@id)]
                                                              /@id/string()

评估此XPath 2.0表达式时是否具有此当前文档

<t>
    <component name='comp1'>
        <child> ... </child>
        <child> ... </child>
        <optional id='1'> ... </optional>
    </component>
    <component name='comp2'>
        <child> ... </child>
        <child> ... </child>
        <optional id='1'> ... </optional>
        <optional id='1'> ... </optional>
        <optional id='2'> ... </optional>
    </component>
</t>

生成了想要的结果

1 2

评估此XPath表达式的时间复杂度仅为线性(O(N))且二次(O(N ^ 2))