2017-10-15 73 views
0

我需要使用下面的代码来验证XML:元件“样式表”必须从模式命名空间“http://www.w3.org/2001/XMLSchema”

代码

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的新手。请让我知道如何解决这个错误。

问候

回答

0

送到接口SchemaFactory.newSchema(XML文档)应是一个XSD架构文件,但你似乎提供的XSLT样式表。

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

不要谷歌的错误消息,它不会帮助你。在您编写更多代码之前,请先详细阅读各种XML技术及其用途。

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处理器可能引发的问题。