【问题标题】:Transform Multiple XML file using XSLT and Saxon使用 XSLT 和 Saxon 转换多个 XML 文件
【发布时间】:2015-10-23 08:46:26
【问题描述】:

我想使用 Saxon 创建从多个 xml 文件到只有一个 xml(输出。xml)的转换。 xml 文件将由我的测试工具生成,因此可用的 xml 数量没有限制。假设在一个文件夹中我有几个文件:

Summaryfile001.xml
Summaryfile002.xml
Detailsfile001.xml
Detailsfile002.xml
SummaryandDetailsAllFiles.html

我只想获取摘要文件。 SummaryFiles001.xml 内:

<SummaryFile>
  <testname>file001</testname>    
  <Error>1</Error>
  <test>1</test>
  <skipped>1</skipped>
  <failures>0</failures>
  <dateAndTime>15082015093021</dateAndtime>
</SummaryFile>

我使用saxon将Junit格式报告转换为一个输出匹配,所以模板:

JUnitFormat.xslt

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

<xsl:param name="fileName" select="'output.xml'" />

<xsl:template match="/">
    <xsl:apply-templates mode="inFile" select="collection('file:///C:/Users/Documents/Resultfiles?select=*.xml;recurse=yes')"/>
</xsl:template>

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates  select="@* | node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="SummaryFile">
  <xsl:variable name="testName" select="//SummaryFile/testname"/>
  <xsl:variable name="test" select="//SummaryFile/test"/>
  <xsl:variable name="Error" select="//SummaryFile/Error"/>
  <xsl:variable name="skipped" select="//SummaryFile/skipped"/>
  <xsl:variable name="dateAndtime" select="//SummaryResultsFile/dateAndtime"/>
  <xsl:variable name="failures" select="//SummaryFile/failures"/>
  <testsuites>
            <testsuite  name="{$testName}"
                        tests="{$test}" 
                        time="{$dateAndTime}"
                        failures="{$failures}"  
                        errors="{$Error}"
                        skipped="{$skipped}">
            </testsuite>
  </testsuites>
</xsl:template>

但是,当我尝试使用 saxon 执行此命令时:

java -jar saxon9he.jar -xslt:JUnitTemplate.xslt -s:C:/Users/Documents/Resultfiles -o:Output.xml

我无法进行转换。它说转型失败。我只能对单个 xml 进行转换,但不能对多个 xml 进行转换。所以 xslt 的想法:

1. Look for only Summary Files
2. Get all the data from Summary file.xml 
3. Create one output xml contain all summary result file in JUnit format

有人知道我该如何解决这个问题吗?

【问题讨论】:

    标签: xml xslt junit automated-tests saxon


    【解决方案1】:

    使用 java -jar saxon9he.jar -xslt:JUnitTemplate.xslt -it:main -o:Output.xml 运行 Saxon 并将您的代码更改为

    <xsl:output indent="yes" method="xml"/>
    
    
    <xsl:template name="main">
      <testsuites>
        <xsl:apply-templates select="collection('file:///C:/Users/Documents/Resultfiles?select=Summary*.xml;recurse=yes')/SummaryFile"/>
      </testsuites>
    </xsl:template>
    
    
    
    <xsl:template match="SummaryFile">
                <testsuite  name="{testname}"
                            tests="{testname}" 
                            time="{dateAndtime}"
                            failures="{failures}"  
                            errors="{Error}"
                            skipped="{skipped}">
                </testsuite>
    
    </xsl:template>
    

    【讨论】:

    • 嗨,Martin Honnen,虽然我已经标记了你上周的回答。这是一个有效的解决方案。谢谢!
    【解决方案2】:

    你在正确的路线上。我会在命名模板上调用转换,例如使用 -it:main,而不是提供虚拟源文档,但我认为这不是您的问题的原因。

    我很担心你的说法:“它说转型失败”。撒克逊人永远不会在不输出有关失败的方式和原因的信息的情况下这么说。要么您没有看到该信息,在这种情况下您需要找出原因,或者您没有将其传递给我们,这对您毫无帮助。

    我怀疑问题出在您的调用参数-s:C:/Users/Documents/Resultfiles 上。我认为这是目录的名称而不是 XML 文件的名称。 Saxon 实际上具有从命令行处理整个目录的能力(将整个样式表应用到每个文件),但这不是您在这里尝试做的。请改用-it:main 调用样式。

    【讨论】:

    • 嗨 Michael Kay,我遇到了一个错误,因为(我认为)它想要解析 html。这是我收到的错误消息:SummaryandDetailsAllFiles.html:SXXP0003 的第 31 行第 3 列错误:XML 解析器报告的错误:元素类型“b”必须由匹配的结束标记“”终止。处理SummaryandDetailsAllFiles.html时:org.xml.sax.SAXParseException; systemId:file:/C:/Users/Documents/Resultfiles/SummaryandDetailsAllFilesl;行号:31;列号:3;元素类型“b”必须以匹配的结束标记“”结束。 7 改造失败
    • 所以我假设我需要将 -xslt 更改为 -it:main?
    • 是的,该消息表明它正在尝试处理 -s 目录中的所有文件,并且它们并非都是 XML。所以不要提供 -s 选项,提供 -it:main 而不是在命名模板处输入。
    猜你喜欢
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2012-01-12
    相关资源
    最近更新 更多