Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JavaXMLAPI将XML转换为XSL而不出错_Java_Xml_Xslt_Xsd - Fatal编程技术网

如何使用JavaXMLAPI将XML转换为XSL而不出错

如何使用JavaXMLAPI将XML转换为XSL而不出错,java,xml,xslt,xsd,Java,Xml,Xslt,Xsd,我试图使用XSLT格式将XML文件转换为HTML,但出现了一个错误 RROR: 'Namespace prefix 'vuln' is undeclared.' FATAL ERROR: 'Could not compile stylesheet' XML文件以开头 <?xml version='1.0' encoding='UTF-8'?> <?xml-stylesheet type="text/xsl" version ="2.0" href="nvdXSLT.xs

我试图使用XSLT格式将XML文件转换为HTML,但出现了一个错误

RROR:  'Namespace prefix 'vuln' is undeclared.'
FATAL ERROR:  'Could not compile stylesheet' 
XML文件以开头

<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet type="text/xsl" version ="2.0" href="nvdXSLT.xsl"?>
<nvd xmlns:cpe-lang="http://cpe.mitre.org/language/2.0" 
 xmlns:scapcore="http://scap.nist.gov/schema/scap-core/0.1" 
 xmlns:vuln="http://scap.nist.gov/schema/vulnerability/0.4" 
 xmlns:cvss="http://scap.nist.gov/schema/cvss-v2/0.2" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns:patch="http://scap.nist.gov/schema/patch/0.1" 
 xmlns="http://scap.nist.gov/schema/feed/vulnerability/2.0" >
   <entry id="CVE-2007-5333">
   <vuln:vulnerable-software-list>
     <vuln:product>cpe:/a:apache_software_foundation:tomcat:4.1.34</vuln:product>
     <vuln:product>cpe:/a:apache_software_foundation:tomcat:4.1.37</vuln:product>
     <vuln:product>cpe:/a:apache:tomcat:4.1.24</vuln:product>
     <vuln:product>cpe:/a:apache:tomcat:5.5.5</vuln:product>
     <vuln:product>cpe:/a:apache:tomcat:5.5.2</vuln:product>
   </vuln:vulnerable-software-list>
   <vuln:cve-id>CVE-2007-5333</vuln:cve-id>
   <vuln:published-datetime>2008-02-11T20:00:00.000-05:00</vuln:published-datetime>
   <vuln:last-modified-datetime>2014-03-15T23:16:41.310-04:00</vuln:last-modified-datetime>
  </entry>
 </nvd>

简单地说,接收XML文件和XSL文件并创建int HTML格式的输出文件

对于无法编译样式表的原因,您的错误非常清楚:

ERROR:  'Namespace prefix 'vuln' is undeclared.'
FATAL ERROR:  'Could not compile stylesheet' 
vuln是需要在xslt根目录中声明的名称空间:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:vuln="http://www.someurl.com/vuln">
我想你想要这样的东西:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:vuln="http://scap.nist.gov/schema/vulnerability/0.4" xmlns:cvss="http://scap.nist.gov/schema/cvss-v2/0.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:patch="http://scap.nist.gov/schema/patch/0.1" xmlns="http://scap.nist.gov/schema/feed/vulnerability/2.0">
    <xsl:output method="html" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <!-- TODO: Auto-generated template -->
        <html>
            <body>
                <h1>Parsing NVD XML file</h1>
                <table border="1">
                    <tr>
                        <th>hasAffectedProducts</th>
                    </tr>
                    <xsl:for-each select="/nvd/entry">
                        <xsl:for-each select="vuln:vulnerable-software-list">
                            <tr>
                                <td>
                                    <xsl:value-of select="vuln:product"/>
                                </td>
                            </tr>
                        </xsl:for-each>
                        <tr>
                            <td>
                                <xsl:value-of select="vuln:cve-id"/>
                            </td>
                            <td>
                                <xsl:value-of select="vuln:published-datetime"/>
                            </td>
                            <td>
                                <xsl:value-of select="vuln:last-modified-datetime"/>
                            </td>
                        </tr>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

样式表有两个问题

第一个问题涉及名称空间。您需要将vuln前缀绑定到样式表中与文档中相同的名称空间URI,并且还需要将前缀绑定到http://scap.nist.gov/schema/feed/vulnerability/2.0 URI,它是文档的默认命名空间。XPath表达式中的非固定名称指的是不在命名空间中的元素,因此要将文档中的元素与默认xmlns匹配,必须在XSLT中使用前缀:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:vuln="http://scap.nist.gov/schema/vulnerability/0.4"
     xmlns:feed="http://scap.nist.gov/schema/feed/vulnerability/2.0">
第二个问题是每个人的内在问题


非常感谢,它可以工作,但问题是我无法从XML中正确读取XSL。我只得到了表格的标题,没有行的结果。请帮忙!!有人能帮我解决这个问题吗!!我刚得到一个没有记录的空表,似乎XSL文件不能正常工作!!它对我有用。用最新的xslt更新您的帖子。我更新了xslt文件,使其更加详细,但问题仍然存在。非常感谢你!!输入XML的名称空间格式不正确,因为它使用了vuln前缀,但没有声明它。XSLT只能在名称空间格式良好的XML上操作,因此您需要在源代码处修复XML以正确声明其名称空间。它已修复,但我得到了空表,似乎XSL transformer无法正常工作,请提供帮助?!变压器工作正常,是样式表出错-对于未来的问题,请尝试包含真正代表您实际问题的示例。如果您不确定某个特定功能是否重要,那么最好还是将其包括在内-我们过滤掉噪音比猜测可能遗漏了什么要容易得多。我完全同意,但当前的问题是,在解决第一个名称空间错误后,空输出会出现。因此,基于这一点,我对我的原始帖子进行了更新,并对我被问到的问题进行了调整。谢谢你的帮助,问题还是一样,空出来放!!,我在XML文件中添加了一些行,让您了解问题的全貌。我希望你明白我的意思@user3247440您说您使用的是javax.xml.transform API-您能编辑这个问题以显示您用于运行转换的Java代码吗?@user3247440我注意到您刚刚添加了xmlns=http://scap.nist.gov/schema/feed/vulnerability/2.0 到样式表-这是从哪里来的?您的真实输入XML是否有默认的名称空间声明,与您在问题中发布的示例输入不同,nvd和entry元素不在名称空间中?我将该链接用于XML文件样式表标记!!只是为了确保两者之间的所有URI都相同files@user3247440这就造成了所有的不同——如果您的输入文档有一个xmlns默认名称空间,那么您就不能在XPath表达式中使用不固定的名称。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:vuln="http://scap.nist.gov/schema/vulnerability/0.4" xmlns:cvss="http://scap.nist.gov/schema/cvss-v2/0.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:patch="http://scap.nist.gov/schema/patch/0.1" xmlns="http://scap.nist.gov/schema/feed/vulnerability/2.0">
    <xsl:output method="html" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <!-- TODO: Auto-generated template -->
        <html>
            <body>
                <h1>Parsing NVD XML file</h1>
                <table border="1">
                    <tr>
                        <th>hasAffectedProducts</th>
                    </tr>
                    <xsl:for-each select="/nvd/entry">
                        <xsl:for-each select="vuln:vulnerable-software-list">
                            <tr>
                                <td>
                                    <xsl:value-of select="vuln:product"/>
                                </td>
                            </tr>
                        </xsl:for-each>
                        <tr>
                            <td>
                                <xsl:value-of select="vuln:cve-id"/>
                            </td>
                            <td>
                                <xsl:value-of select="vuln:published-datetime"/>
                            </td>
                            <td>
                                <xsl:value-of select="vuln:last-modified-datetime"/>
                            </td>
                        </tr>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:vuln="http://scap.nist.gov/schema/vulnerability/0.4"
     xmlns:feed="http://scap.nist.gov/schema/feed/vulnerability/2.0">
<xsl:for-each select="feed:nvd/feed:entry">
 <xsl:for-each select="feed:nvd/feed:entry">
    <tr>
      <td><xsl:for-each select="/vuln:vulnerable-software-list">
<xsl:for-each select="vuln:vulnerable-software-list/vuln:product">
  <xsl:value-of select="." />
</xsl:for-each>