我有一个巨大的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>
答案 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))