我试图解析一个xml,但对我来说没有机会,如果有人能解释我该怎么做或者解释问题在哪里,我会感激的:
在这里,我的xml代码:
<?xml version='1.0' encoding='UTF-8'?>
<nvd xmlns:vuln="http://scap.nist.gov/schema/vulnerability/0.4" xmlns:scap- core="http://scap.nist.gov/schema/scap-core/0.1" xmlns="http://scap.nist.gov/schema/feed/vulnerability/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cpe-lang="http://cpe.mitre.org/language/2.0" xmlns:patch="http://scap.nist.gov/schema/patch/0.1" xmlns:cvss="http://scap.nist.gov/schema/cvss-v2/0.2" pub_date="2013-01-22T06:34:06" xsi:schemaLocation="http://scap.nist.gov/schema/patch/0.1 http://nvd.nist.gov/schema/patch_0.1.xsd http://scap.nist.gov/schema/scap-core/0.1 http://nvd.nist.gov/schema/scap-core_0.1.xsd http://scap.nist.gov/schema/feed/vulnerability/2.0 http://nvd.nist.gov/schema/nvd-cve-feed_2.0.xsd" nvd_xml_version="2.0">
<entry id="CVE-2009-0001">
<vuln:vulnerable-software-list>
<vuln:product>cpe:/a:apple:quicktime:3</vuln:product>
<vuln:product>cpe:/a:apple:quicktime:7.3.1.70</vuln:product>
</vuln:vulnerable-software-list>
<vuln:cvss>
<cvss:base_metrics>
<cvss:score>9.3</cvss:score>
<cvss:access-vector>NETWORK</cvss:access-vector>
<cvss:access-complexity>LOW</cvss:access-complexity>
<cvss:authentication>NONE</cvss:authentication>
</cvss:base_metrics>
</vuln:cvss>
</entry>
<entry id="CVE-2009-0002">
<vuln:vulnerable-software-list>
<vuln:product>cpe:/a:apple:quicktime:3</vuln:product>
<vuln:product>cpe:/a:apple:quicktime:6.5</vuln:product>
<vuln:product>cpe:/a:apple:quicktime:7.0</vuln:product>
<vuln:product>cpe:/a:apple:quicktime:7.3.1.70</vuln:product>
</vuln:vulnerable-software-list>
<vuln:cvss>
<cvss:base_metrics>
<cvss:score>3.2</cvss:score>
<cvss:access-vector>NETWORK</cvss:access-vector>
<cvss:access-complexity>LOW</cvss:access-complexity>
<cvss:authentication>NONE</cvss:authentication>
</cvss:base_metrics>
</vuln:cvss>
</entry>
</nvd>我在下面的xsl文件中使用xslt:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:nvd="http://scap.nist.gov/schema/feed/vulnerability/2.0"
xmlns:vuln="http://scap.nist.gov/schema/vulnerability/0.4" version="1.0">
<xsl:output encoding="UTF-8" method="text" />
<xsl:template match="/"><xsl:apply-templates select="nvd:nvd" /></xsl:template>
<xsl:template match="nvd:nvd"><xsl:apply-templates select="nvd:entry" /></xsl:template>
<xsl:template match="nvd:entry">
<xsl:apply-templates select="vuln:vulnerable-software-list">
<xsl:with-param name="entryid" select="@id" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="vuln:vulnerable-software-list">
<xsl:param name="entryid" />
<xsl:for-each select="vuln:product">
<xsl:value-of select="$entryid" />:<xsl:value-of select="text()" /><xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>结果是:
# xsltproc a2.xsl a2.xml
CVE-2009-0001:cpe:/a:apple:quicktime:3
CVE-2009-0001:cpe:/a:apple:quicktime:7.3.1.70
CVE-2009-0002:cpe:/a:apple:quicktime:3
CVE-2009-0002:cpe:/a:apple:quicktime:6.5
CVE-2009-0002:cpe:/a:apple:quicktime:7.0
CVE-2009-0002:cpe:/a:apple:quicktime:7.3.1.70但现在我想添加cvss:得分a,如下所示:
CVE-2009-0001:cpe:/a:apple:quicktime:3@9.3
CVE-2009-0001:cpe:/a:apple:quicktime:7.3.1.70@9.3
CVE-2009-0002:cpe:/a:apple:quicktime:3@3.2
CVE-2009-0002:cpe:/a:apple:quicktime:6.5@3.2
CVE-2009-0002:cpe:/a:apple:quicktime:7.0@3.2
CVE-2009-0002:cpe:/a:apple:quicktime:7.3.1.70@3.2我试过这样想:
添加
<xsl:apply-templates select="vuln:cvss/cvss:base_metrics/cvss:score"> 或
select="*/score" 但这不管用..。:-(
当然,我添加了一个参数:
<xsl:value-of select="$score" /><xsl:text>在模板vuln中:vulnerable-软件列表
谢谢你的帮忙
问候
阿诺
嗨,Jallopa:我尝试在-每个部分中添加您的代码,但是它返回如下:
xsltproc a.xsl a.xml
XPath error : Undefined namespace prefix
xmlXPathCompiledEval: evaluation failed
runtime error: file a.xsl line 21 element value-of
XPath evaluation returned no result.第21行包括:
<xsl:value-of select="ancestor::entry[1]/vuln:cvss/cvss:base_metrics/cvss:score"/>嗨,wst,我试过你的代码,但是这次
xsltproc a.xsl a.xml
XPath error : Undefined namespace prefix
xmlXPathCompiledEval: evaluation failed
runtime error: file a.xsl line 15 element with-param
Failed to evaluate the expression of variable 'score'. 第15行是:
<xsl:with-param name="score" select="vuln:cvss/cvss:base_metrics/cvss:score"/>(我在你的选择中加上了-param)
有什么想法吗?
谢谢。
发布于 2013-02-01 17:24:58
在foreach元素中添加:
<xsl:value-of select="ancestor::entry[1]/vuln:cvss/cvss:base_metrics/cvss:score"/>这将导航到树上的第一个"entry“元素,然后导航到cvss:score。
发布于 2013-02-01 17:25:10
这个问题可以简单地解决一些,但是保持模板样式,您只需将该值作为另一个参数传递:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:nvd="http://scap.nist.gov/schema/feed/vulnerability/2.0"
xmlns:vuln="http://scap.nist.gov/schema/vulnerability/0.4" version="1.0">
<xsl:output encoding="UTF-8" method="text" />
<xsl:template match="/"><xsl:apply-templates select="nvd:nvd" /></xsl:template>
<xsl:template match="nvd:nvd"><xsl:apply-templates select="nvd:entry" /></xsl:template>
<xsl:template match="nvd:entry">
<xsl:apply-templates select="vuln:vulnerable-software-list">
<xsl:with-param name="entryid" select="@id" />
<xsl:with-param name="score" select"vuln:cvss/cvss:base_metrics/cvss:score"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="vuln:vulnerable-software-list">
<xsl:param name="entryid" />
<xsl:param name="score" />
<xsl:for-each select="vuln:product">
<xsl:value-of select="$entryid" />:<xsl:value-of select="text()" />@<xsl:value-of select="$score" /><xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>https://stackoverflow.com/questions/14651587
复制相似问题