我可以使用 SAXON XSLT 从文档中选择标签作为参数

问题描述 投票:0回答:1

这是我的代码示例。我想在转换 XML 文档时使用多个文档。因此,我将它们作为参数传递给我的 XSLT 文件。问题是我无法从这些参数文档中选择 XML 标签。

Java代码

public class MultipleDocument {

    @Test
    public void parser_multiple_document() throws SaxonApiException, IOException {
        final Path path = Paths.get("src/test/resources/Transformations/multipleDocs.xslt");

        final StreamSource xsltFile =  new StreamSource(path.toFile());
        final Processor processor = new Processor(false);
        final DocumentBuilder documentBuilder = processor.newDocumentBuilder();

        final DocZipMocks docZipMocks = new DocZipMocks();


        final Iterable<XdmNode> zipMocks = Stream.of("<resEvento xmlns:xsd="http://www.w3.org/2001/XMLSchema"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" versao="1.01"    xmlns="http://www.portalfiscal.inf.br/nfe"><cOrgao>00</cOrgao><CNPJ>123456789</CNPJ><chNFe>000000000000000000000000</chNFe><dhEvento>2000-02-06T04:05:57-03:00</dhEvento><tpEvento>00000</tpEvento><nSeqEvento>0</nSeqEvento><xEvento>Registro de Passagem Automatico MDF-e com CT-e</xEvento><dhRecbto>2000-02-06T04:05:57-03:00</dhRecbto><nProt>000000000000</nProt></resEvento>")
                .map(this.createDocument(documentBuilder))
                .collect(Collectors.toList());

        final XsltCompiler compiler = processor.newXsltCompiler();
        compiler.setParameter(new QName("docs"),new XdmValue(zipMocks));

        final XsltExecutable stylesheet = compiler.compile(xsltFile);
        final Xslt30Transformer transformer = stylesheet.load30();

        final ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
        final Writer writer = new OutputStreamWriter(byteStream,"UTF-8");
        final Serializer out = processor.newSerializer(writer);

        transformer.transform(new StreamSource(new StringReader("<dummmy><my>ass</my></dummmy>")), out);

        final String string = new StringBuilder(byteStream.toString("UTF-8")).toString();

        System.out.println(string);
    }

    private Function<String,XdmNode> createDocument(DocumentBuilder documentBuilder){
        return doc -> {
            try {
                return documentBuilder.build(new StreamSource(new StringReader(doc)));
            } catch (SaxonApiException e) {
                throw new RuntimeException(e);
            }
        };
    }
}

#XML

<resEvento xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" versao="1.01"
    xmlns="http://www.portalfiscal.inf.br/nfe">
    <cOrgao>00</cOrgao>
    <CNPJ>123456789</CNPJ>
    <chNFe>000000000000000000000000</chNFe>
    <dhEvento>2000-02-06T04:05:57-03:00</dhEvento>
    <tpEvento>00000</tpEvento>
    <nSeqEvento>0</nSeqEvento>
    <xEvento>Registro de Passagem Automatico MDF-e com CT-e</xEvento>
    <dhRecbto>2000-02-06T04:05:57-03:00</dhRecbto>
    <nProt>000000000000</nProt>
</resEvento>

XSLT 代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="text" indent="no"
                omit-xml-declaration="yes" />
     <xsl:param name="docs" as="document-node()*" />


    <xsl:template match="/">

        <xsl:for-each select="$docs">
            <xsl:value-of select="resEvento/CNPJ/text()"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

我做错了什么?为什么我无法从参数文档中选择特定标签?

java xml xslt saxon
1个回答
0
投票

这是一个古老的问题:你的元素位于命名空间中,但你的样式表正在寻找非命名空间中的元素。

© www.soinside.com 2019 - 2024. All rights reserved.