我需要根据从父母/祖父母的兄弟姐妹的孩子中提取的其他值来查找属性值。我认为这将需要两种不同的表达方式。
因此,给定以下 XML(源自可能长达数千行的日志文件):
<p:log xmlns:p="urn:NamespaceInfo">
<p:entries>
<p:entry timestamp="2012-12-31T09:39:25">
<p:attributes>
<p:attrib name="Position" value="1B2" />
<p:attrib name="Something" value="Something_else" />
</p:attributes>
<p:msg>
</p:msg>
</p:entry>
<p:entry timestamp="2012-12-31T09:39:25">
<p:attributes>
<p:attrib name="Form" value="FormA" />
</p:attributes>
<p:msg>
</p:msg>
</p:entry>
<p:entry timestamp="2012-12-31T09:39:25">
<p:msg>Successful....</p:msg>
</p:entry>
<p:entry timestamp="2012-12-31T12:12:12">
<p:attributes>
<p:attrib name="Position" value="1B3" />
<p:attrib name="Something" value="Something_else" />
</p:attributes>
<p:msg>
</p:msg>
</p:entry>
<p:entry timestamp="2012-12-31T09:39:25">
<p:attributes>
<p:attrib name="Form" value="FormB" />
</p:attributes>
<p:msg>
</p:msg>
</p:entry>
<p:entry timestamp="2012-12-31T09:39:25">
<p:msg>Processing....</p:msg>
</p:entry>
<p:entry timestamp="2012-12-31T09:39:25">
<p:msg>Error1</p:msg>
</p:entry>
<p:entry timestamp="2012-12-31T09:39:25">
<p:msg>Error1</p:msg>
</p:entry>
</p:entries>
...
</p:log>
- (
<p:attributes>
父标签可以有多<p:attrib>
个子标签) - (
<p:event>
标签只能有一个<p:msg>
标签)
首先,我需要获取value
对应name
属性为的属性的值Position
,但前提是祖父母的兄弟姐妹有一个文本为p:entry
的孩子。此外,它需要留在该部分内。例如,我不希望第一次出现该对,因为新的/对出现在 之前,即使从技术上讲,与 the是祖父母的兄弟姐妹。p:msg
Error1
Position'/'Value
Position
Value
Error1
p:msg
Error1
Position
接下来,我需要Value
我刚刚抓取的孩子的父母的时间戳属性值。p:entry
所以,找到位置,然后找到祖父标签的时间戳属性值。
所以对于这个例子,我应该只能检索以下值:
1B3
2012-12-31T12:12:12
(给出的日期/时间戳是任意值。这个是不同的,所以你知道我引用的是哪一个)。
我知道有点令人困惑。我还需要确保只获取一个实例,因为我使用 XQuery 从数据库中获取数据,并且每个表达式都必须生成一个奇异值。
p:msg
我可以通过以下方式获得与 with关联的第一个时间戳Error1
: //p:entry[descendant::p:msg='Error1.'][1]/@timestamp
但似乎无法回到树上来获取其他值。
我可以获得具有 p:attrib 孙子的 p:events 的所有时间戳://p:entry[descendant::p:attrib[@name=''Position'']]/@timestamp)[1]
但我似乎无法将其限制为仅具有“Error1”的那个。我不能根据职位进行选择。我必须首先基于内容。
奖金问题
我怎么能在日志文件的下一个实例上再次执行此操作?(不仅仅是第二Error1
条消息,下一次在日志文件中Error1
显示下一个“父/兄弟”匹配的消息)。一旦我得到上述问题的答案,这可能是显而易见的。