我正在尝试使用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);
答案 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?