原帖地址:
http://topic.csdn.net/u/20100112/10/25205b06-3562-455d-b857-91bfda4e657d.html?seed=841321667&r=62682903#r_62682903

解决方案 »

  1.   

    原XML文件 目的是先按year分组,然后再在year中按照typeid分组 
    <?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。
      

  2.   


    <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">
      

  3.   

    运行是没有错误,但是得不到正确答案,按照你修改后的运行得到的xml是空的,这是我换成JDK1.6后的结果,如果去掉你增加的,那么报错信息如下:
    错误:“Unsupported XSL element 'http://www.w3.org/1999/XSL/Transform:for-each-group'”
      

  4.   


    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
      

  5.   

    全部代码:
    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();
    } }
    }
      

  6.   

    我要的不是你上面给出的结果啊:结果应该是这样:
    <?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>
      

  7.   

    爱莫能助了。建议有另一种方法。不通过xls
      

  8.   

    1. 最好的办法是升级如saxon,支持2.0;
    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>