元素'样式表'必须来自架构命名空间,http://www.w3.org/2001/XMLSchema'

时间:2017-10-15 03:14:17

标签: xml xslt xsd

我需要使用以下代码验证xml:

代码

SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

Schema schema = factory.newSchema(new StreamSource(new StringReader(xsl))); //Getting error on this line

XSL文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:fo="http://www.w3.org/1999/XSL/Format">

<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" cdata-section-elements="true"/>

..
</xsl:stylesheet>

我曾试图谷歌出来这个错误,但找不到任何有用的帮助。我是xsl和xml的新手。请让我知道如何解决此错误。

此致

2 个答案:

答案 0 :(得分:0)

提供给SchemaFactory.newSchema()接口的XML文档应该是XSD架构文档,但您似乎在提供XSLT样式表。

我不确定这是否是您调用API的一个简单错误,或者您是否对XSD和XSLT在处理XML文档中所起的作用有一些基本的误解。

请不要谷歌搜索错误消息,它不会帮助您。在编写更多代码之前,请进行更广泛的阅读,了解各种XML技术及其用途。

答案 1 :(得分:0)

XSLT是一种具有XML语法的编程语言,并在名称空间http://www.w3.org/1999/XSL/Transform中定义其元素。如果要验证任何XML文档,那么您需要一个要验证的模式,您似乎想要验证用W3C XSD(XML模式定义)语言编写的模式,如您在

中指示的那样
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

使用命名空间http://www.w3.org/2001/XMLSchema。但是,在代码的下一行中,您需要传入该命名空间中的模式而不是XML实例文档。

我不认为XSLT 1有XSD架构,XSLT 2(https://www.w3.org/TR/xslt20/#schema-for-xslt)有一个,XSLT 3(https://www.w3.org/TR/xslt-30/#xsd11-schema-for-xslt)有一个。您需要将此类架构传递给newSchema调用,然后使用该架构尝试验证您的XSLT文档。

但是,正如我所说的,您似乎正在使用XSLT 1,而这些模式适用于以后的XSLT的更多扩展版本,因此基于模式的验证可能不会发现XSLT 1处理器可能引发的问题。