我有一个扁平结构的xml文件.我们不控制这个xml文件的格式,只需要处理它.我已经重命名了这些字段,因为它们是高度特定于域的,并没有对问题产生任何影响. attribute name="Title"Book A/attrib
<attribute name="Title">Book A</attribute> <attribute name="Code">1</attribute> <attribute name="Author"> <value>James Berry</value> <value>John Smith</value> </attribute> <attribute name="Title">Book B</attribute> <attribute name="Code">2</attribute> <attribute name="Title">Book C</attribute> <attribute name="Code">3</attribute> <attribute name="Author"> <value>James Berry</value> </attribute>
需要注意的关键事项:文件不是特别分层的.书籍由name =’Title’的属性元素的出现界定.但name =’Author’属性节点是可选的.
是否有一个简单的xpath语句,我可以用它来找到书’n’的作者?很容易识别书籍’n’的标题,但作者的价值是可选的.你不能只考虑以下作者,因为在第2册的情况下,这将给作者第3册.
我已经编写了一个状态机来解析它作为一系列元素,但我不禁想到会有一种直接获得我想要的结果的方法.
我们希望@name’Partner’的“attribute”元素遵循@name’Title’的“attribute”元素,其值为’Book n’,而@name’Title’之间没有任何其他“attribute”元素他们(因为如果有,那么作者撰写了其他一些书).换句话说,这意味着我们想要一个作者,其中第一个前面的标题(它“属于”的标题)是我们正在寻找的标题:
//attribute[@name='Author'] [preceding-sibling::attribute[@name='Title'][1][contains(.,'Book N')]]
N = C =>发现< attribute name =“作者”>< value> James Berry< / value>< / attribute>
N = B =>一无所获
使用XSLT 2.0中提供的键和/或分组功能可以使这更容易(如果文件很大,也会更快).
(SO代码解析器似乎认为’//’代表’评论’,但在XPath中它不是!!!叹息.)