使用Java进行XSLT处理

时间:2014-09-18 14:37:02

标签: xml xslt saxon

我正在尝试使用xslt和sax解析器将一种形式的XML转换为另一种形式的XML。这是我的示例inputxml和xsl片段。

输入XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<AXL>
    <ROW>
       <firsname>John</firstname>
       <lastName>Smith</Smith>
    </ROW>
    <ROW>
       <firstname>George</firstname>
       <lastName>Tack</Smith>
    </ROW>
</AXL>

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
    <xsl:template match="text()">
            <xsl:value-of select='normalize-space()'/>
        </xsl:template>
        <xsl:template match="/">
        <!--bom:AML-->
        <xsl:for-each select="//row">
                         <Contact>
            <xsl:attribute name="firstName"><xsl:value-of select="firstName"/></xsl:attribute>
            <xsl:attribute name="lastName"><xsl:value-of select="lastName"/></xsl:attribute>
             </Contact>
                    </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

我可以使用在线工具生成output.xml。但是使用java代码,我只是得到一个空的输出文件。我知道我把它搞砸了,但不知道在哪里?

感谢您的帮助!

好的,这是我的java代码。它是<firstName>。对不起,错字错误。

 System.setProperty("javax.xml.transform.TransformerFactory",  
                        "net.sf.saxon.TransformerFactoryImpl");     

                TransformerFactory factory = TransformerFactory.newInstance();

                Templates template = factory.newTemplates(
                           new StreamSource(new FileInputStream("C:\\XML_Transformation.xsl")));
                        Transformer transformer = template.newTransformer();
                    Source source = new StreamSource(new FileInputStream("C:\\Sample.xml"));
                    Result result = new StreamResult(new FileOutputStream("C:\\Final.xml"));
                    transformer.transform(source, result);

1 个答案:

答案 0 :(得分:0)

正如评论中已经提到的,XML和XSLT都不会生成所需的输出。 XML无效,XSLT还有其他一些问题。因为这可以很容易地修复(所以你可以继续测试,如果你的Java能更好地工作)在这里找到修复的XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<AXL>
  <ROW>
   <firstName>John</firstName>
   <lastName>Smith</lastName>
  </ROW>
  <ROW>
   <firstName>George</firstName>
   <lastName>Tack</lastName>
  </ROW>
</AXL>  

在这里工作XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>

<xsl:template match="/">
  <xsl:for-each select="//ROW">
    <Contact>
        <xsl:attribute name="firstName">
           <xsl:value-of select="firstName"/>
        </xsl:attribute>
        <xsl:attribute name="lastName">
           <xsl:value-of select="lastName"/>
        </xsl:attribute>
    </Contact>
  </xsl:for-each>
</xsl:template>
</xsl:stylesheet>   

结果:

<?xml version="1.0" encoding="UTF-8"?>
<Contact firstName="John" lastName="Smith"/>
<Contact firstName="George" lastName="Tack"/>  

作为附加信息 - 也可以让你的模板与ROW匹配,避免不必要的for-each循环:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>

<xsl:template match="ROW">
<Contact>
   <xsl:attribute name="firstName">
      <xsl:value-of select="firstName"/>
   </xsl:attribute>
   <xsl:attribute name="lastName">
      <xsl:value-of select="lastName"/>
   </xsl:attribute>
</Contact>
</xsl:template>
</xsl:stylesheet>

XSLT有大量的在线资源,但对于初学者,您可以查看一些好的问题和详细解答:XSL xsl:template match="/"In what order do templates in an XSLT document execute, and do they match on the source XML or the buffered output?