2013-02-18 72 views
0

变换我需要改造下面的XML(没有命名空间)如何提供(的xmlns)命名空间中的Java

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<policy> 
<num-drivers>123</num-drivers> 
<risk-policy-ind>false</policy-ind> 
<premium-amt>23.00</premium-amt> 
</policy> 

风格:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" 
xmlns="http://aaa.bbb.com" xmlns:ptws="http://aaa.bbb.com" exclude-result-prefixes="xs fn xsl"> 
<xsl:namespace-alias stylesheet-prefix="ptws" result-prefix="#default"/> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xpath-default-namespace="http://aaa.bbb.com"/> 
<xsl:template match="/"> 
    <xsl:apply-templates/> 
</xsl:template> 
<xsl:template match="ptws:policy"> 
<auto-policy-dto> 
    <xsl:copy-of select="ptws:num-drivers"/> 
    <xsl:copy-of select="ptws:risk-policy-ind"/> 
    <xsl:copy-of select="ptws:premium-amt"/> 
</policy> 
</xsl:template> 

Java代码:

TransformerFactory tfactory = TransformerFactory.newInstance(); 
Source xslt = new StreamSource(IN_XSLT_FILE_NAME); 
Transformer transformer = tfactory.newTransformer(xslt); 

SAXSource source = new SAXSource(
       XMLReaderFactory.createXMLReader(), 
       new InputSource(IN_XML_FILE_NAME)); 
transformer.transform(source, new StreamResult(OUT_XML_FILE_NAME)); 

OUTPUT xml:

<?xml version="1.0" encoding="UTF-8"?> 
    123 
    false 
    23.00 

output.xml中缺少元素。如何在转换时提供名称空间“http://aaa.bbb.com”?

预期的Output.xml:

<?xml version="1.0" encoding="UTF-8"?><ptws:policy xmlns:ptws="http://aaa.bbb.com"> 
    <num-drivers xmlns="http://aaa.bbb.com">123</num-drivers> 
    <risk-policy-ind xmlns="http://aaa.bbb.com">false</risk-policy-ind> 
    <premium-amt xmlns="http://aaa.bbb.com">23.00</premium-amt> 
</ptws:policy> 

我试图做这样的事情:

public class XMLUtilsTest { 

    private static final String IN_XML_FILE_NAME = "C:/sampleXML.xml"; 
    private static final String IN_XSLT_FILE_NAME = "C:/sample.xslt"; 

    private static final String OUT_XML_FILE_NAME = "C:/rc/output.xml"; 

    public static Boolean transformXML() throws SAXException, IOException, URISyntaxException, TransformerException { 

    try { 
     TransformerFactory tfactory = TransformerFactory.newInstance(); 
     Source xslt = new StreamSource(IN_XSLT_FILE_NAME); 
     Transformer transformer = tfactory.newTransformer(xslt); 

     SAXSource source = new SAXSource(
       new NamespaceFilter(XMLReaderFactory.createXMLReader()), 
       new InputSource(IN_XML_FILE_NAME)); 
     transformer.transform(source, new StreamResult(OUT_XML_FILE_NAME));    
    } 
    catch(Exception ex){ 
     System.out.println(ex.getMessage()); 
    }      

    } 

protected static class NamespaceFilter extends XMLFilterImpl { 

    String requiredNamespace = "http://aaa.bbb.com"; 

    public NamespaceFilter(XMLReader parent) { 
     super(parent); 
    } 

    @Override 
    public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException { 
     if(arg0 != requiredNamespace) arg0 = requiredNamespace; 
     super.startElement(arg0, arg1, arg2, arg3); 
    }  
} 
} 

但是,这会产生如下XML。仍然缺少的元素

<?xml version="1.0" encoding="UTF-8"?><ptws:policy xmlns:ptws="http://aaa.bbb.com"> 
< xmlns="http://aaa.bbb.com">123</> 
< xmlns="http://aaa.bbb.com">false</> 
< xmlns="http://aaa.bbb.com">23.00</> 
</ptws:policy> 
+0

在XSLT中使用'ptws:'的意图是什么?您的输入XML没有名称空间,那么为什么不用'poicy','num-drivers'等来引用元素呢? – JLRishe 2013-02-18 22:45:07

+0

如果您要提供您尝试生成的输出XML示例,这将会很有帮助。 – JLRishe 2013-02-18 22:51:28

+0

上面的输入xml用作示例xml,不用于测试实际的xml。我试图测试示例xml是有效的,然后执行xslt转换。我不想通过添加命名空间来修改示例(输入)xml,这些命令空间由课程生成必需的output.xml。 – ams2705 2013-02-18 22:58:48

回答

0

我想你只是想改变所有元素的命名空间?

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ptws="http://aaa.bbb.com" 
    exclude-result-prefixes="xsl"> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:element name="ptws:{local-name()}"> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

您的模板不工作的原因是因为<xsl:template match="ptws:policy">不匹配任何东西,默认模板只是复制文本节点。

相关问题