我正在使用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
谷歌搜索结果是空的。我怀疑在将它们提交给xsltproc
之前我可能会以某种方式合并xml文件,但我希望有一个更简单的解决方案。
答案 0 :(得分:2)
xsltproc
分别转换每个指定的XML文档,因为它确实是唯一合理的事情,因为XSLT在单个源树上运行,并且xsltproc
没有足够的信息来将多个文档组合成一个树。由于您的模板使用&#34;开始&#34;发出文本节点。和&#34;结束&#34;文本,为每个输入文档发出这些节点。
有几种方法可以安排只有一个&#34;开始&#34;和一个&#34;结束&#34;。 所有合理的都是从<testsuite>
元素的模板中提取文本节点开始的。如果每个&#34; TestSuite:&#34;输出中的行应该对应一个<testsuite>
元素,那么即使您在物理上合并输入文档,也需要这样做。
一个解决方案是取消&#34;开始&#34;和&#34;结束&#34;来自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
</xsl:text>
<xsl:apply-templates select="testsuite"/>
<xsl:text>
end</xsl:text>
</xsl:template>
<xsl:template match="testsuite">
...
</xsl:template>
</xsl:stylesheet>