使用奇怪的标记编译样式表XSL <a:tag>

时间:2016-12-12 14:23:12

标签: java xml parsing xslt xml-parsing

这是我在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,'&#xA;')"/>
            </xsl:for-each>
        </xsl:for-each> 
    </xsl:template>
</xsl:stylesheet>

如果进入XML和XLS,我有正常的标签,如:

[MsgID],[PartnerID],[orderDetails6]它工作正常。

但我的XML有alwyas标签从:[a:...]

开始

知道怎么解决吗?

1 个答案:

答案 0 :(得分:2)

XSLT的XML输入需要是名称空间良好的。这意味着如果它使用像<a:orderDetails6>这样的限定名称,则需要在名称空间声明中声明前缀(a),例如xmlns:a="some.uri"。从技术上讲,您的XML符合XML规范,但不符合XML命名空间规范,但XSLT(以及许多其他XML处理软件)要求符合这两者。

您还需要在样式表中声明命名空间。除非在名称空间声明中声明前缀//a:orderDetails,否则不能使用a之类的路径表达式。 (相反,您不需要xmlns:fo声明,因为从不使用前缀fo。)