• 使用XSLT转换XML2XML


           在EDI(电子数据交换)系统中经常会遇到这样的事情,也就是在系统内定义的XML文档是一种格式,而外系统定义的则是另外的一种格式,或者是不同的外系统定义的格式不太一样,例如对于人员有些地方定义为<employee>,而其他的组织则使用<worker> 或者 <associate>.① 这个时候就需要一种XML转换成XML的格式了。

          XSLT则就脱颖而出了,XSLT是XSL(EXtensible Stylesheet Language 扩展样式表语言)的一部分,专门负责XML转换成其他格式的一种语言。具体的学习可以参考网上的XSLT的资料。

         如果你使用Java的话,很幸运,Java提供了一组API支持了XSLT的使用,可以不使用第三方的库就可以轻松的进行转换。进行转换只需要准备源文件(被转换的XML),转换的模板(XSLT文件),一段Java代码。

         样例如下:

         源文件:

        

    <?xml version="1.0" encoding="UTF-8"?>
    <discussionForumHome>
    <messageBoard id="1" name="Java Programming"/>
    <messageBoard id="2" name="XML Programming"/>
    <messageBoard id="3" name="XSLT Questions"/>
    </discussionForumHome>

       模板:

       

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/>
    <!-- match the document root -->
    <xsl:template match="/">
    <html>
    <head>
    <title>Discussion Forum Home Page</title>
    </head>
    <body>
    <h1>Discussion Forum Home Page</h1>
    <h3>Please select a message board to view:</h3>
    <ul>
    <xsl:apply-templates
    select="discussionForumHome/messageBoard"/>
    </ul>
    </body>
    </html>
    </xsl:template>
    <!-- match a <messageBoard> element -->
    <xsl:template match="messageBoard">
    <li>
    <a href="viewForum?id={@id}">
    <xsl:value-of select="@name"/>
    </a>
    </li>
    </xsl:template>
    </xsl:stylesheet>

     Java代码

    import java.io.File;
    import java.io.IOException;
    import java.net.URISyntaxException;
    
    import javax.xml.transform.Source;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.stream.StreamResult;
    import javax.xml.transform.stream.StreamSource;
    
    public class TestMain {
        public static void main(String[] args) throws IOException, URISyntaxException, TransformerException {
            TransformerFactory factory = TransformerFactory.newInstance();
            Source xslt = new StreamSource(new File("D:\\dev\\learn\\discussionForumHome.xslt"));
            Transformer transformer = factory.newTransformer(xslt);
    
            Source text = new StreamSource(new File("D:\\dev\\learn\\discussionForumHome.xml"));
            transformer.transform(text, new StreamResult(new File("D:\\dev\\learn\\output.xml")));
        }
    }

    TIP 1.输出中文文件名有问题

        如果你直接使用StreamResult进行文件输出时,会出现这样的现象,文件名变成%的ASCII格式,例如

        

    transformer.transform(text, new StreamResult(new File(
            "D:\\dev\\learn\\小狗.xml")));

    输出的文件名为:

    %E5%B0%8F%E7%8B%97.xml

    这个时候跟踪StreamResult的代码,发现 StreamResult在构造函数里面用文件的ASCII吗作为SystemID了。

    setSystemId(f.toURI().toASCIIString());

    这个时候可以通过设置OutputStream方式进行设置

    StreamResult sr = new StreamResult();
    
    sr.setOutputStream(new FileOutputStream(new File("D:\\dev\\learn\\小狗.xml")));
            
    transformer.transform(text,sr);

    注①。举例摘自《Java and XSLT》一书,同时XML文件内容也是如此

         

  • 相关阅读:
    逻辑回归问题(Logistic Regression)
    丑数
    用两个栈实现队列
    重建二叉树
    单变量的线性回归(Linear Regression with One Variable)
    机器学习
    二维数组中的查找
    面经
    亚信实习---->PLSQL链接Oracle
    亚信实习小练习
  • 原文地址:https://www.cnblogs.com/kaka/p/3092364.html
Copyright © 2020-2023  润新知