xsltproc在多个文件之前和之后添加文本

时间:2017-07-25 14:51:52

标签: xslt xslt-1.0 libxslt

我正在使用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文件,但我希望有一个更简单的解决方案。

1 个答案:

答案 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&#x0A;</xsl:text>
    <xsl:apply-templates select="testsuite"/>
    <xsl:text>&#x0A;end</xsl:text>
  </xsl:template>

  <xsl:template match="testsuite">
    ...
  </xsl:template>
</xsl:stylesheet>