匹配节点基于前面的节点名称以及与匹配节点

时间:2018-03-12 11:21:47

标签: xml xpath match edi

我的问题在于将已转换为XML的EDI文件转换为组。它包含动态的消息列表,因此更多的UNH标签包含以下BGM标签和DTM标签。我不是在寻找XSLT样式表的答案 在这种情况下,我可以使用1到35个DTM标签,始终遵循BGM标签 有更多DTM标签跟随其他标签,如PTY,但我只想匹配BGM标签后的任何DTM标签和所有下一个兄弟DTM标签。

我的最终目标是遍历所有细分并将其添加到组中,如http://www.truugo.com/edifact/d96a/orders/中所述,其中UNH-FTX将进入GRP0,以下RFF(强制)-DTM(有条件)进入GRP1等上。 我希望在XPATH 1.0中尽可能少地执行此操作。

提前谢谢!

说明性示例,其中bold =匹配节点。在这种情况下,节点数最多可以连续35个。在其他情况下,我可能必须匹配高达200000
< UNH>
<组>
<值大于1< /值GT;
< /组>
< / UNH>
< BGM>   ... < BGM>
< DTM>   ... < / DTM>
< DTM>   ... < / DTM>

< PAI>   ... < / PAI>
< DTM>   ... < / DTM>
< PTY>  ... < / PTY>
...
< UNH> ... < / UNH>
< BGM>   ... < BGM>
< DTM>   ... < / DTM>
< DTM>   ... < / DTM>
< DTM>   ... < / DTM>
< DTM>   ... < / DTM>

< IMD>   ... < / IMD>
< DTM>   ... < / DTM>
< DTM>   ... < / DTM>
< PTY>  ... < / PTY>

1 个答案:

答案 0 :(得分:0)

这确实是违反直觉的,但这里是如何通过使用兄弟运算符进行过滤来解决集合:

第一个BGM之后的第一组DTM

//DTM [ (preceding-sibling::*)[name()!="DTM"][last()]  
         = //BGM[1]                                     ]

第二个BGM集上IMD之后的两个DTM:

//DTM [  (preceding-sibling::*)[name()!="DTM"][last()] 
         = //BGM[2]/following-sibling::IMD[1]           ]