如何使用JavaXMLAPI将XML转换为XSL而不出错
我试图使用XSLT格式将XML文件转换为HTML,但出现了一个错误如何使用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
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>