xslt正则表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xslt正则表达式相关的知识,希望对你有一定的参考价值。

处理nessus xml文件的更多问题。

我有一些来自nessus的xml数据,它可以在xml标签中存储主机名等信息,可以使用这个xsl标签提取:

<xsl:value-of select="../ReportItem[(@pluginID=12053)]/description"/>

然后唯一的问题是这个标签除了主机名之外还在其中存储了一堆垃圾。例如,标签通常包含以下信息:

概要:可以获取远程主机的网络名称。说明:远程主机侦听UDP端口137或TCP端口445并回复NetBios nbtscan或SMB请求。请注意,此插件收集要在其他插件中使用的信息,但本身不会生成报告。解决方案:无风险因素:无插件输出:已收集以下6个NetBIOS名称:VOODOO1 =计算机名称VOODOO =工作组/域名VOODOO1 =文件服务器服务VOODOO =浏览器服务选举VOODOO =主浏览器MSBROWSE =主浏览器远程主机在其适配器上具有以下MAC地址:10:50:56:ab:10:02

我唯一感兴趣的部分是“VOODOO1 =计算机名称”部分。实际上在“=”符号之前更准确。我想知道是否可以在标签的'select'中使用正则表达式函数,例如:

<xsl:value-of select="regexp(../ReportItem[(@pluginID=12053)]/description,'w =')"/>

这将只提取与正则表达式匹配的标记内容并显示它。现在我有标签显示的全部内容很烦人。我试图使用各种变体

<xsl:analyze-string select="$elValue" regex="w = ">

标签没有运气。我不断收到错误,说'不能成为<td>的子标签或我尝试过的任何其他xslt元素,即for-each等。

提前致谢。

根据目前为止的反馈,这里是nessus生成的一些xml

<ReportItem port="137" svc_name="netbios-ns?" protocol="udp" severity="1"     pluginID="10150" pluginName="Windows NetBIOS / SMB Remote Host Information Disclosure" pluginFamily="Windows">
<description>Synopsis :

It is possible to obtain the network name of the remote host.

Description :

The remote host listens on UDP port 137 or TCP port 445 and replies to NetBIOS nbtscan or SMB requests. 

Note that this plugin gathers information to be used in other plugins but does not itself generate a report.

Solution :

n/a

Risk factor :

None

Plugin output :
The following 6 NetBIOS names have been gathered :

 VOODOO1       = Computer name  VOODOO              = Workgroup / Domain name     VOODOO1       = File Server Service  VOODOO              = Browser Service Elections     VOODOO              = Master Browser
 __MSBROWSE__     = Master Browser

The remote host has the following MAC address on its adapter :
   01:a0:52:bf:0a:02

</description>
</ReportItem>`

<xsl:value-of select="regexp(../ReportItem[(@pluginID=12053)]/description,'w =')"/>这条线不起作用。我做了,看看是否有人知道是否有类似的东西。它只会产生错误,因为我做了它。

答案

你需要XSLT 2.0。我怀疑你用xsl:analyze-string得到的错误消息是因为你使用的是XSLT 1.0处理器。

另一答案

正如Mike Kay所说,这不适用于XSLT 1.0。获取Saxon的.NET版本,以便您可以使用更现代的XSLT版本。您可以从命令行或Powershell中调用它。这是一个让您入门的示例:

 <xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">  
    <xsl:template match="description">
        <xsl:analyze-string select="."
            regex="(w+)s+=s*Computer name">
            <xsl:matching-substring>
                <xsl:value-of select="regex-group(1)" />
            </xsl:matching-substring>
            <xsl:non-matching-substring>
            </xsl:non-matching-substring>
        </xsl:analyze-string>
    </xsl:template>
</xsl:stylesheet>

以上是关于xslt正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式使用 xslt 匹配某些元素文本

xslt正则表达式

XSLT 是不是提供了一种通过使用正则表达式来识别 xml 元素的方法?

如何为 XSLT 代码片段配置 CruiseControl 的 C# 版本?

通过 Java 正则表达式提取 semver 版本字符串的片段

text 正则表达式片段