是否有更简单的方法来编写此XPath表达式,特别是最后一行。我正在从tshark搜索XML转储,寻找具有某些属性的特定数据包。这是我有的XPath表达式
count(//packet[
proto/@name="dhcpv6"
and .//field/@showname="Message type: Solicit (1)"
and .//field/@show="Link-layer address: 30:00:01:dc:d9:82"
and .//field[@show="Interface-Id"]/field[@show="option type: 18"]/../field[@show="Interface-ID: AVC-0123456789"]])
这是获取
的数据包计数1) Contain a child of <proto name="dhcpv6">
2) Contain a descendant of <field showname="Message type: Solicit (1)/">
3) Contain a descendant of <field show="Link-layer address: 30:00:01:dc:d9:82"/>
4) Contain a descendant of
<field show="Interface-Id">
<field show="option type: 18"/>
<field show="Interface-ID: AVC-0123456789"/>
</field>
我不喜欢的位是它找到“选项类型:18”,然后返回到父级并查找“Interface-ID:AVC-0123456789”。有没有办法用'和'语句写这个?它有效,但有点令人困惑和不可读的IMO。
这是XML的简化版本。请注意,字段标记可以在多个级别内,这就是我使用.//的原因。
<?xml version="1.0"?>
<packet>
<proto name="dhcpv6">
<field showname="Message type: Solicit (1)"/>
<field show="Link-layer address: 30:00:01:dc:d9:82"/>
<field show="Interface-Id">
<field show="option type: 18"/>
<field show="Interface-ID: AVC-0123456789"/>
</field>
</proto>
</packet>
BTW,我坚持使用XPath 1.0,因为我正在使用的工具目前支持。
答案 0 :(得分:2)
以下似乎对我有用并且更有意义:
count(//packet[
proto/@name="dhcpv6"
and .//field/@showname="Message type: Solicit (1)"
and .//field/@show="Link-layer address: 30:00:01:dc:d9:82"
and .//field[@show="Interface-Id"
and field[@show="option type: 18"]
and field[@show="Interface-ID: AVC-0123456789"]
]
])
基本上第三个标准是:
您也可以按如下方式编写:
count(//packet[
proto/@name="dhcpv6"
and .//field/@showname="Message type: Solicit (1)"
and .//field/@show="Link-layer address: 30:00:01:dc:d9:82"
and .//field
[@show="Interface-Id"]
[field[@show="option type: 18"]]
[field[@show="Interface-ID: AVC-0123456789"]]
])
这意味着第三个.//field
必须满足所有3个缩进标准。
答案 1 :(得分:0)
这对你有用吗?
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:variable name="count" select="count(//packet/proto[@name='dhcpv6' and /.//field[@showname='Message type: Solicit (1)'] and .//field[@show='Link-layer address: 30:00:01:dc:d9:82']
and .//field[@show='Interface-Id'] and ./field[@show='option type: 18'] and ./field[@show='Interface-ID: AVC-0123456789']])"/>
<xsl:template match="/">
<div>
Count is: <xsl:value-of select="$count"/>
</div>
</xsl:template>
</xsl:stylesheet>