xml - How to supply (xmlns) namespace during XSLT transform in Java -
i need transform below xml (without namespace)
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>
style:
<?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 code:
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
the elements missing in output.xml. how can supply namespace "http://aaa.bbb.com" while transform?
expected 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>
i tried this:
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 { seek { 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); } } }
but produces below xml. still elements missing
<?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>
i think trying alter namespace of elements?
<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>
the reason template doesn't work because <xsl:template match="ptws:policy">
doesn't match , default template copies text nodes.
java xml xslt transform
No comments:
Post a Comment