XSLT从两个不同的来源(XML文件和Excel工作表)

有没有办法让我的xslt文件从两个不同的来源获得input? 一个来源是一个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工作表:

  AB 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> 

从这里,我想改变<xsl:for-each select="Sequence/Number">部分的xslt 。 我想要以下几点:

  • 从xml文件中读取<Number>
  • 检查该号码是否在Excel工作表中
  • xslt为该号码分配正确的<Code>号码

我有我可以传递XML文件的代码,以便xslt可以根据xslt创build一个新的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的答案中得到它的工作。

假设您将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>