0

我正在使用该xsltproc实用程序使用如下命令将多个 xml 测试结果转换为漂亮的打印控制台输出。

xsltproc stylesheet.xslt testresults/*

哪里stylesheet.xslt看起来像这样:

<!-- One testsuite per xml test report file -->
<xsl:template match="/testsuite">
  <xsl:text>begin</xsl:text>
  ...
  <xsl:text>end</xsl:text>
</xsl:template>

这给了我一个类似于这样的输出:

begin
TestSuite: 1
end
begin
TestSuite: 2
end
begin
TestSuite: 3
end

我想要的是以下内容:

begin
TestSuite: 1
TestSuite: 2
TestSuite: 3
end

谷歌搜索是空的。我怀疑我可能能够在将 xml 文件提供给之前以某种方式合并它们xsltproc,但我希望有一个更简单的解决方案。

4

1 回答 1

2

xsltproc分别转换每个指定的 XML 文档,因为 XSLT 在单个源树上运行,并且xsltproc没有足够的信息将多个文档组合成单个树,这确实是它唯一明智的做法。由于您的模板发出带有“开始”和“结束”文本的文本节点,因此为每个输入文档发出这些节点。

有几种方法可以安排只有一个“开始”和一个“结束”。 所有合理的都是从将文本节点从<testsuite>元素模板中取出来开始的。如果输出中的每个“TestSuite:”行都应该对应一个<testsuite>元素,那么即使您物理合并输入文档,您也需要这样做。

一种解决方案是完全从 XSLT 中删除“开始”和“结束”行的职责。例如,xsl:text从样式表中删除元素并编写一个简单的脚本,如下所示:

echo begin
xsltproc stylesheet.xslt testresults/*
echo end

或者,如果单个 XML 文件不以 XML 声明开头,那么您可以通过运行xsltproc如下命令来动态合并它们:

{ echo "<suites>"; cat testresults/*; echo "</suites>"; } \
    | xsltproc stylesheet.xslt -

相应的样式表可能会采用以下形式:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:template match="/suites">
    <!-- the transform of the root element produces the "begin" and "end" -->
    <xsl:text>begin&#x0A;</xsl:text>
    <xsl:apply-templates select="testsuite"/>
    <xsl:text>&#x0A;end</xsl:text>
  </xsl:template>

  <xsl:template match="testsuite">
    ...
  </xsl:template>
</xsl:stylesheet>
于 2017-07-25T16:11:16.907 回答