尝试根据列表过滤 xml 标签。
列表示例:文件名 list.txt
1
2
3
4
5
6
示例 XML
<id=1 />
<id=4 />
<id=11 />
<id=3 />
<id=23 />
使用 XPath?是否可以编写一个 xpath 查询来过滤 xml 标签,只留下 list.txt 中没有的内容?
输出
<id=11 />
<id=23 />
这可能在 xpath 语句中吗?
感谢所有提供反馈和建议的人。我已经弄清楚了我自己的问题。请提供有关我的解决方案的反馈,看看是否可以做得更好。谢谢..
我的问题与 Nessus 有关。它的报道太可怕了。我能够查看 .nessus 文件 ver2 并将我需要的标签中的信息拼凑起来。我会把它放在这里,供其他可能使用类似报告的 Nessus 用户使用。
我需要一种方法来过滤掉报告中不重要的插件信息。我决定最好的方法是使用 xslt 过滤插件,我也使用它来将 xml 文件格式化为电子表格应用程序的有用表格格式。我决定使用单独的 xml 文件来存储包含不需要的 Nessus 插件的标签。xml文件的结构是这样的:
<?xml version="1.0" encoding="ISO-8859-1"?>
<exclude>
<nessusPlugin>19506</nessusPlugin>
<nessusPlugin>45590</nessusPlugin>
</exclude>
我遵循了关于查看“文档”功能的建议,最终想出了这个 xslt:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="excludedplugins" select="document('nessusExcludePluginList.xml')/exclude/nessusPlugin"/>
<xsl:template match="/">
<html>
<body>
<h2>
Nessus Report, Targets: <xsl:value-of select="count(NessusClientData_v2/Report/ReportHost)"/>
</h2>
<br/>High Risk Count: <xsl:value-of select="count(NessusClientData_v2/Report/ReportHost/ReportItem[risk_factor='High'])"/>
<br/>Medium Risk Count: <xsl:value-of select="count(NessusClientData_v2/Report/ReportHost/ReportItem[risk_factor='Medium'])"/>
<br/>Low Risk Count: <xsl:value-of select="count(NessusClientData_v2/Report/ReportHost/ReportItem[risk_factor='Low'])"/>
<br/>Irrelavant Risk (Severity < 2) Count: <xsl:value-of select="count(NessusClientData_v2/Report/ReportHost/ReportItem[@severity<2])"/>
<table border="1">
<tr bgcolor="#9acd32">
<th>DNS Name</th>
<th>NetBios Name</th>
<th>IP Address</th>
<th>MAC Address</th>
<th>Operating System</th>
<th>Port</th>
<th>Protocol</th>
<th>Service Name</th>
<th>n Plugin ID</th>
<th>n Severity</th>
<th>n Risk_Factor</th>
<th>n Plugin Name</th>
<th>n Plugin Family</th>
<th>Description</th>
<th>Plugin Output</th>
<th>Synopsis</th>
</tr>
<xsl:for-each select="NessusClientData_v2/Report/ReportHost">
<xsl:for-each select="ReportItem">
<xsl:choose>
<xsl:when test="not(@pluginID=$excludedplugins)">
<tr>
<td><xsl:value-of select="../@name"/></td>
<td><xsl:value-of select="../HostProperties/tag[@name='netbios-name']"/></td>
<td><xsl:value-of select="../HostProperties/tag[@name='host-ip']"/></td>
<td><xsl:value-of select="../HostProperties/tag[@name='mac-address']"/></td>
<td><xsl:value-of select="../HostProperties/tag[@name='operating-system']"/></td>
<td><xsl:value-of select="@port"/></td>
<td><xsl:value-of select="@protocol"/></td>
<td><xsl:value-of select="@svc_name"/></td>
<td><xsl:value-of select="@pluginID"/></td>
<td><xsl:value-of select="@severity"/></td>
<td><xsl:value-of select="risk_factor"/></td>
<td><xsl:value-of select="@pluginName"/></td>
<td><xsl:value-of select="@pluginFamily"/></td>
<td><xsl:value-of select="description"/></td>
<td><xsl:value-of select="plugin_output"/></td>
<td><xsl:value-of select="synopsis"/></td>
</tr>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
我一起破解了这个并想出了这些解决方案: 1. 添加带有不需要的插件列表的 xml 文件:
<xsl:variable name="excludedplugins" select="document('nessusExcludePluginList.xml')/exclude/nessusPlugin"/>
要与排除的插件进行比较:
在我尝试之前不确定是否可以进行比较。事实证明,这适用于节点中的所有项目。多么划算!我还没有弄清楚为什么这不起作用:
<xsl:when test="@pluginID!=$excludedplugins">
= 运算符将检查所有节点,但 != 似乎根本不起作用。好在“不”功能存在。
为了使它更好,我想做的是看看是否有办法用插件编号的直接列表而不是 xml 文件向它提供不需要的插件列表,如下所示:58181 34252 34220 11219 10335 22964
我还认为可能有一个更优雅的解决方案,它不使用“for each”。无论如何,谢谢大家的帮助。