我需要一些帮助将XML文件转换为CSV。
以下是我的XML文件的摘录:
<?xml version='1.0' encoding='UTF-8'?>
<nvd xmlns:cvss="http://scap.nist.gov/schema/cvss-v2/0.2" xmlns:cpe-lang="http://cpe.mitre.org/language/2.0" xmlns:vuln="http://scap.nist.gov/schema/vulnerability/0.4" xmlns="http://scap.nist.gov/schema/feed/vulnerability/2.0" xmlns:patch="http://scap.nist.gov/schema/patch/0.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:scap-core="http://scap.nist.gov/schema/scap-core/0.1" nvd_xml_version="2.0" pub_date="2013-04-12T12:00:30" 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">
<entry id="CVE-2012-5048">
<vuln:vulnerable-configuration id="http://nvd.nist.gov/">
<cpe-lang:logical-test negate="false" operator="OR">
<cpe-lang:fact-ref name="cpe:/a:optimalog:optima_plc:1.5.2"/>
<cpe-lang:fact-ref name="cpe:/a:optimalog:optima_plc:1.5.1"/>
</cpe-lang:logical-test>
</vuln:vulnerable-configuration>
<vuln:vulnerable-software-list>
<vuln:product>cpe:/a:optimalog:optima_plc:1.4.10</vuln:product>
<vuln:product>cpe:/a:optimalog:optima_plc:1.5.0</vuln:product>
</vuln:vulnerable-software-list>
<vuln:cve-id>CVE-2012-5048</vuln:cve-id>
<vuln:published-datetime>2012-09-28T06:40:22.507-04:00</vuln:published-datetime>
<vuln:last-modified-datetime>2013-04-10T23:31:27.227-04:00</vuln:last-modified-datetime>
<vuln:cvss>
<cvss:base_metrics>
<cvss:score>7.8</cvss:score>
<cvss:access-vector>NETWORK</cvss:access-vector>
</cvss:base_metrics>
</vuln:cvss>
<vuln:cwe id="CWE-399"/>
<vuln:references xml:lang="en" reference_type="UNKNOWN">
<vuln:source>MISC</vuln:source>
<vuln:reference href="http://www.us-cert.gov" xml:lang="en">http://www.us-cert.gov</vuln:reference>
</vuln:references>
<vuln:references xml:lang="en" reference_type="UNKNOWN">
<vuln:source>BID</vuln:source>
<vuln:reference href="http://www.securityfocus.com/bid/55712" xml:lang="en">55712</vuln:reference>
</vuln:references>
<vuln:summary>APIFTP Server</vuln:summary>
</entry>
</nvd>
下面你会发现我尝试过的XSLT文件,但由于没有将cvss:score和cvss:access-vector写入不同的列,因此无法正常工作。任何人都可以帮我写XML文件的所有内容到不同的列?
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:strip-space elements="*" />
<xsl:template match="/*/child::*">
<xsl:for-each select="child::*">
<xsl:if test="position() != last()"><xsl:value-of select="normalize-space(.)"/>,</xsl:if>
<xsl:if test="position() = last()"><xsl:value-of select="normalize-space(.)"/><xsl:text>
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
你在做的是:
<xsl:template match="/*/child::*">
选择任何第二级节点,什么是nvd / entry。在你的例子中。 跑到这个孩子:
<xsl:for-each select="child::*">
这是您示例中的所有第三级节点。并选择任何较低级别节点中的任何文本。
"select="normalize-space(.)"
如前所述,@ Martin Honnen并不清楚你要做什么。 但有些评论 要仅从当前节点选择文本,请使用:
"select="text()";
另外,我认为根据xml文件中元素的位置生成CVS文件的字段并不是一个好主意。 xml中的order off元素可以更改并且仍然正确,但这会破坏您的CVS。
更新:根据更详细的要求提供可能的解决方案:
<xsl:template match="*[name()='entry']">
<xsl:value-of select="@id"/>
<xsl:text>;</xsl:text>
<xsl:value-of select="*/vuln:product[1]"/>
<xsl:text>;</xsl:text>
<xsl:value-of select="vuln:cvss/cvss:base_metrics/cvss:score"/>
<xsl:text>;</xsl:text>
<xsl:value-of select="vuln:references[vuln:source='MISC']/vuln:reference"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="vuln:references[vuln:source='BID']/vuln:reference"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="vuln:published-datetime" />
<xsl:text>
</xsl:text>
</xsl:template>
样式表声明应该是这样的:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:cvss="http://scap.nist.gov/schema/cvss-v2/0.2"
xmlns:vuln="http://scap.nist.gov/schema/vulnerability/0.4">