这是我在java中的XML文件和方法:
测试 .XML
<?xml version="1.0" encoding="UTF-8"?>
<orders>
<orderDetails>
<a:orderDetails6>
<a:MsgId>text1</a:MsgId>
<a:PartnerId>text1</a:PartnerId>
<a:OrderId>text1</a:OrderId>
</a:orderDetails6>
</orderDetails>
</orders>
RX 的.java
public class RX {
public static void main(String[] args) throws TransformerException, SAXException, IOException, ParserConfigurationException {
File stylesheet = new File("C:\\style.xsl");
File xmlSource = new File("C:\\test.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(xmlSource);
StreamSource stylesource = new StreamSource(stylesheet);
Transformer transformer = TransformerFactory.newInstance().newTransformer(stylesource);
Source source = new DOMSource(document);
Result outputTarget = new StreamResult(new File("C:\\x.csv"));
transformer.transform(source, outputTarget);
}
}
风格的.xsl
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" >
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
<xsl:text>A:MsgId,A:PartnerId,A:OrderId
</xsl:text>
<xsl:for-each select="//orderDetails">
<xsl:for-each select="//a:orderDetails6">
<xsl:value-of select="concat(a:MsgId,',',a:PartnerId,',',a:OrderId,'
')"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
如果进入XML和XLS,我有正常的标签,如:
[MsgID],[PartnerID],[orderDetails6]它工作正常。
但我的XML有alwyas标签从:[a:...]
开始知道怎么解决吗?
答案 0 :(得分:2)
XSLT的XML输入需要是名称空间良好的。这意味着如果它使用像<a:orderDetails6>
这样的限定名称,则需要在名称空间声明中声明前缀(a
),例如xmlns:a="some.uri"
。从技术上讲,您的XML符合XML规范,但不符合XML命名空间规范,但XSLT(以及许多其他XML处理软件)要求符合这两者。
您还需要在样式表中声明命名空间。除非在名称空间声明中声明前缀//a:orderDetails
,否则不能使用a
之类的路径表达式。 (相反,您不需要xmlns:fo
声明,因为从不使用前缀fo
。)