运行是没有错误,但是得不到正确答案,按照你修改后的运行得到的xml是空的,这是我换成JDK1.6后的结果,如果去掉你增加的,那么报错信息如下: 错误:“Unsupported XSL element 'http://www.w3.org/1999/XSL/Transform:for-each-group'”
import java.io.File; import java.io.FileOutputStream;import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; public class TestXml_XLS { public static void main(String args[]) throws TransformerException { String src = "test.xml";//原XML文件 String dest= "testResult.xml";//要生成的XML文件 String xslt="test.xsl";//用来转化原XML文件的样式表 // File xmlFile = new File(src); // File xsltFile = new File(xslt); // File dest2 = new File(dest); // Source xmlSource = new StreamSource(xmlFile); // Source xsltSource = new StreamSource(xsltFile); // StreamResult sr = new StreamResult (dest2.toString()); // TransformerFactory transFact =TransformerFactory.newInstance(); // Transformer trans = transFact.newTransformer(xsltSource); // trans.transform(xmlSource, sr);
try { TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer (new javax.xml.transform.stream.StreamSource ("test01.xsl")); transformer.transform (new javax.xml.transform.stream.StreamSource ("test.xml"), new javax.xml.transform.stream.StreamResult ( new FileOutputStream("testResult.xml"))); } catch (Exception e) { e.printStackTrace( ); } } }结果是:<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="GB2312"?>
<catalog>
<cd>
<title>Empire Burlesque </title>
<typeid>001 </typeid>
<year>1985 </year>
</cd>
<cd>
<title>Hide your heart </title>
<typeid>002 </typeid>
<year>1985 </year>
</cd>
<cd>
<title>Still got the blues </title>
<typeid>001 </typeid>
<year>1986 </year>
</cd>
</catalog>
要求转成如下格式:
<?xml version="1.0" encoding="GB2312"?>
<Result>
<Year id = "1985">
<Typeid num = "001">
<title>Empire Burlesque </title>
</Typeid>
<Typeid num = "002">
<title>Hide your heart </title>
</Typeid>
</Year>
<Year id = "1986">
<Typeid num = "001">
<title>Still got the blues </title>
</Typeid>
</Year>
</Result>
XSLT样式表
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:h="http://www.xml.org/pipe/HTTP"
>
<xsl:output method="xml"/> <xsl:template match="catalog">
<root>
<xsl:for-each-group select="cd" group-by="year">
<year id="{current-grouping-key()}">
<xsl:for-each-group select="current-group()" group-by="typeid">
<typeid num="{current-grouping-key()}">
<title> <xsl:value-of select="current-group()/title"/> </title>
</typeid>
</xsl:for-each-group>
</year>
</xsl:for-each-group>
</root>
</xsl:template>
</xsl:stylesheet>
操作xml和xslt的java代码:
String src = "d:/xslt/test.xml";//原XML文件
String dest= "d:/testResult.xml";要生成的XML文件
String xslt="d:/xslt/test.xsl";//用来转化原XML文件的样式表
File xmlFile = new File(src);
File xsltFile = new File(xslt);
File dest2 = new File(dest);
Source xmlSource = new StreamSource(xmlFile);
Source xsltSource = new StreamSource(xsltFile);
StreamResult sr = new StreamResult (dest2.toString());
TransformerFactory transFact =TransformerFactory.newInstance();
Transformer trans = transFact.newTransformer(xsltSource);
trans.transform(xmlSource, sr);
执行完上述代码以后报如下错误:
javax.xml.transform.TransformerException: Could not find function: current-grouping-key
后来我采用在原XML文件中嵌入xslt样式表,然后用浏览器(IE6.0)打开XML文件报出以下提示:
关键字 xsl:template 可能不包含 xsl:for-each-group。
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:h="http://www.xml.org/pipe/HTTP">
<xsl:output method="xml" /> <xsl:template match="catalog">
<root>
<xsl:for-each select="catalog">
<xsl:for-each-group select="cd" group-by="year">
<year id="{current-grouping-key()}">
<xsl:for-each-group select="current-group()"
group-by="typeid">
<typeid num="{current-grouping-key()}">
<title>
<xsl:value-of
select="current-group()/title" />
</title>
</typeid>
</xsl:for-each-group>
</year>
</xsl:for-each-group>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
<xsl:for-each select="catalog">
错误:“Unsupported XSL element 'http://www.w3.org/1999/XSL/Transform:for-each-group'”
import java.io.File;
import java.io.FileOutputStream;import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
public class TestXml_XLS { public static void main(String args[]) throws TransformerException {
String src = "test.xml";//原XML文件
String dest= "testResult.xml";//要生成的XML文件
String xslt="test.xsl";//用来转化原XML文件的样式表
// File xmlFile = new File(src);
// File xsltFile = new File(xslt);
// File dest2 = new File(dest);
// Source xmlSource = new StreamSource(xmlFile);
// Source xsltSource = new StreamSource(xsltFile);
// StreamResult sr = new StreamResult (dest2.toString());
// TransformerFactory transFact =TransformerFactory.newInstance();
// Transformer trans = transFact.newTransformer(xsltSource);
// trans.transform(xmlSource, sr);
try { TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer =
tFactory.newTransformer
(new javax.xml.transform.stream.StreamSource
("test01.xsl")); transformer.transform
(new javax.xml.transform.stream.StreamSource
("test.xml"),
new javax.xml.transform.stream.StreamResult
( new FileOutputStream("testResult.xml")));
}
catch (Exception e) {
e.printStackTrace( );
} }
}结果是:<?xml version="1.0" encoding="UTF-8"?>
Empire Burlesque
001
1985
Hide your heart
002
1985
Still got the blues
001
1986
http://www.rgagnon.com/javadetails/java-0407.html
test.xml<?xml version="1.0" encoding="GB2312"?>
<root>
<cd>
<title>Empire Burlesque</title>
<typeid>001</typeid>
<year>1985</year>
</cd>
<cd>
<title>Hide your heart</title>
<typeid>002</typeid>
<year>1985</year>
</cd>
<cd>
<title>Still got the blues</title>
<typeid>001</typeid>
<year>1986</year>
</cd>
</root>
test.xsl<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/">
<root>
<xsl:for-each select="root/cd">
<title>
<xsl:value-of select="title" />
</title>
<typeid>
<xsl:value-of select="typeid" />
</typeid>
<year>
<xsl:value-of select="year" />
</year>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
java:import java.io.File;
import java.io.FileOutputStream;import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;public class TestXml_XLS { public static void main(String args[]) throws TransformerException { try { TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory
.newTransformer(new javax.xml.transform.stream.StreamSource(
"test.xsl")); transformer.transform(new javax.xml.transform.stream.StreamSource(
"test.xml"), new javax.xml.transform.stream.StreamResult(
new FileOutputStream("testResult.xml")));
} catch (Exception e) {
e.printStackTrace();
} }
}
<?xml version="1.0" encoding="UTF-8"?>
<year id='1985'>
<typeid num='001'>
<title>Empire Burlesque </title>
</typeid>
<typeid num='002'>
<title>Hide your heart </title>
</typeid>
</year>
<year id='1986'>
<typeid num='001'>
<title>Still got the blues </title>
</typeid>
</year>
2. 1.0语法参考如下,使用前请测试性能(应该很快的:));<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:h="http://www.xml.org/pipe/HTTP"
>
<xsl:output method="xml" indent="yes"/> <xsl:key name="by-year" match="cd" use="year"/>
<xsl:key name="by-typeid" match="cd" use="concat(year,'_',typeid)"/> <xsl:template match="catalog">
<root>
<xsl:apply-templates select="cd[generate-id() =
generate-id(key('by-year', year))]"
mode="group_year"/>
</root>
</xsl:template>
<xsl:template match="cd" mode="group_year">
<year id="{year}">
<xsl:call-template name="typeid">
<xsl:with-param name="cds" select="key('by-year', year)"/>
</xsl:call-template>
</year>
</xsl:template>
<xsl:template name="typeid">
<xsl:param name="cds"/>
<xsl:apply-templates select="$cds[generate-id() =
generate-id(key('by-typeid', concat(year,'_',typeid)))]"
mode="group_typeid">
<xsl:with-param name="cds" select="key('by-year', year)"/>
</xsl:apply-templates>
</xsl:template> <xsl:template match="cd" mode="group_typeid">
<xsl:param name="cds"/>
<xsl:variable name="tid" select="typeid"/>
<typeid num="{typeid}">
<xsl:copy-of select="$cds[typeid/text()=$tid]/title"/>
</typeid>
</xsl:template>
</xsl:stylesheet>