XSLT文件(XML2CSV)

时间:2013-04-13 10:51:14

标签: xml xslt csv

我需要一些帮助将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>&#xD;</xsl:text>
    </xsl:if>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

1 个答案:

答案 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>&#xD;</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">