XSLT从两个不同的源读取(XML文件和Excel表)

时间:2016-06-24 15:38:55

标签: java xml excel xslt

有没有办法让我的xslt文件从两个不同的来源获得输入?一个源是XML文件,另一个是Excel工作表。我需要从他们两个获取数据。例如,我有xslt

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

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="Data/AAA">
        <xsl:for-each select=".">
            <Data xmlns="MyProtocol.xsd">
                <BBB>
                    <Id><xsl:value-of select="Id"/></Id>
                    <Timestamp><xsl:value-of select="Timestamp"/></Timestamp>
                    <xsl:if test="Transfer">
                        <Transfer><xsl:value-of select="Transfer"/></Transfer>
                    </xsl:if>
                    <Code>0</Code>
                    <xsl:for-each select="Sequence/Number">
                        <Result>
                            <Number><xsl:value-of select="."/></Number>
                            <Code>0</Code>
                        </Result>
                    </xsl:for-each>
                </BBB>
            </Data>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

Excel表格:

     A                  B

1    Number      |      Code
     -----------------------
2    5556667777         1
3    5559877890         1
4    5552835291         0
.    ...
.    ...
.    ...

xml:

<Data xmlns="MyProtocol.xsd">
    <AAA>
        <Id>2</Id>
        <Timestamp>2016-31-12</Timestamp>
        <Sequence>
            <Number>5556667777</Number>
            <Number>5559877890</Number>
            <Number>5552835291</Number>
        </Sequence>
    </AAA>
</Data>

从这里开始,我想更改xslt部分的<xsl:for-each select="Sequence/Number">。我想谈谈以下内容:

  • 从xml文件
  • 中读取<Number>
  • 检查该号码是否在Excel表格中
  • <Code>
  • 中为该号码指定正确的xslt号码

我有代码,我可以传递XML文件,以便xslt可以根据xslt创建一个新的XML文件;但是,我无法弄清楚如何做到这一点。

这是我的代码:

File stylesheet = new File(xsltFilePath);
InputSource inputSource = new InputSource(new ByteArrayInputStream(xmlString.getBytes()));

Document document = DocumentBuilderFactory.newInstance()
        .newDocumentBuilder().parse(inputSource);

StreamSource stylesource = new StreamSource(stylesheet);
Transformer transformer = TransformerFactory.newInstance().newTransformer(stylesource);

StringWriter stringWriter = new StringWriter();
transformer.transform(new DOMSource(document), new StreamResult(stringWriter));

return stringWriter.toString();

如果我只使用xml文件,上面的代码工作正常。我怎样才能实现上面描述的内容?提前谢谢!

更新:通过将Excel工作表转换为xml文件(通过Java代码)然后按照下面的Martin Honnen回答来实现它。

1 个答案:

答案 0 :(得分:2)

假设您已将XML数据导出为XML文档,您可以使用例如拉入第二个文档。

<xsl:param name="sheet-uri" select="'sheet.xml'"/>
<xsl:param name="sheet-doc" select="document($sheet-uri)"/>

然后

                <xsl:for-each select="Sequence/Number">
                    <Result>
                        <Number><xsl:value-of select="."/></Number>
                        <Code>
                           <xsl:variable name="referenced-code" select="$sheet-doc//Sequence[Number = current()]/Code"/>
                           <xsl:choose>
                             <xsl:when test="$referenced-code">
                                <xsl:value-of select="$referenced-code"/>
                             </xsl:when>
                             <xsl:otherwise>0</xsl:otherwise>
                           </xsl:choose>
                        </Code>
                    </Result>
                </xsl:for-each>