xslt - 解析目标xml中的模式

时间:2014-07-15 14:50:44

标签: java xslt

我使用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

1 个答案:

答案 0 :(得分:0)

第一步是解决SAXParseException。这是因为rules.xsl文件不是命名空间良好的。除非在样式表中声明,否则不能在样式表中使用命名空间前缀dt。所以添加xmlns:dt =&#34; http://www.intershop.com/xml/ns/enfinity/6.1/core/impex-dt"到样式表。

如果您显示为rules.xsl的文件是整个文件,那么它将失败,因为该文件不是XSLT样式表。

关于对架构的引用,我无法帮助您解决第一个问题。这将有助于显示您想要生成的输出。但是你似乎首先要解决一些更基本的问题。