我使用xslt将一个xml转换为另一个xml。 关键是在目标xml中我需要解决shema。 应该驻留此架构的链接?请为我提供正确的方法。 使用的API是否足够:
import javax.xml.transform.*;
public class Main implements URIResolver{
private File root;
public static void main(String[] args) throws TransformerException, TransformerConfigurationException,
FileNotFoundException, IOException {
TransformerFactory tFactory = TransformerFactory.newInstance();
tFactory.setURIResolver(new URIResolver() {
public Source resolve(String href, String base) {
if (href.endsWith("in.xml")) {
return new StreamSource(this.getClass().getResourceAsStream("in.xml"));
} else {
return null;
}
}
});
Transformer transformer = tFactory.newTransformer(new StreamSource("rules.xsl"));
transformer.transform(new StreamSource("in.xml"), new StreamResult(new FileOutputStream("out.xml")));
System.out.println("************* The result is in out.xml *************");
@Override
public Source resolve(String href, String base) throws TransformerException {
StreamSource source = new StreamSource(getInputStream(href));
// this works with saxon7/saxon6.5.2/xalan
source.setSystemId(href);
return source;
}
protected InputStream getInputStream(String path)
{
InputStream file = null;
try
{
// load from a dir
file = new FileInputStream(new File(this.root, path));
}
catch (FileNotFoundException e)
{
e.printStackTrace();
System.out.println("File not found");
}
return file;
}
in.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<enfinity
xmlns:dt="http://www.intershop.com/xml/ns/enfinity/6.1/core/impex-dt">..
rules.xsl:
<custom-attribute name="isPerformance" dt:dt="int">1</custom-attribute>
我得到了: org.xml.sax.SAXParseException:未绑定与元素类型“custom-attribute”关联的属性“dt:dt”的前缀“dt”。 线程“main”中的异常java.lang.NullPointerException
答案 0 :(得分:0)
第一步是解决SAXParseException。这是因为rules.xsl文件不是命名空间良好的。除非在样式表中声明,否则不能在样式表中使用命名空间前缀dt。所以添加xmlns:dt =&#34; http://www.intershop.com/xml/ns/enfinity/6.1/core/impex-dt"到样式表。
如果您显示为rules.xsl的文件是整个文件,那么它将失败,因为该文件不是XSLT样式表。
关于对架构的引用,我无法帮助您解决第一个问题。这将有助于显示您想要生成的输出。但是你似乎首先要解决一些更基本的问题。