有没有办法在文本文件中追加当前项而不是在XSLT中写入换行符?

时间:2015-11-09 10:07:21

标签: xslt xslt-2.0

我有一些正在生成wiki标记的XSLT:

||Host / SIM||||User CPU - Avg||User CPU - 95th% tile||System CPU - Avg||System CPU - 95th% tile||
                               |dub-001544-vm01
                                            |23.88
                                            |60.87
                                            |9.83
                                            |13.8

上面的标记会生成一个表,但应该格式化为:

||Host / SIM||||User CPU - Avg||User CPU - 95th% tile||System CPU - Avg||System CPU - 95th% tile||
|dub-001544-vm01 |23.88 |60.87 |9.83 |13.8

所有单元格条目应位于同一行。生成第一个单元格项目(dub-001544-vm01)的XSLT是:

<xsl:template name="populateHostSim">
    <xsl:param name="action" />
    <xsl:param name="mode" />
    <xsl:param name="currentHost" />
    <xsl:param name="currentResult" />
    <xsl:message>In populateHostSim, with mode: <xsl:value-of select="$mode"/></xsl:message>
    <xsl:message>In populateHostSim, with current host: <xsl:value-of select="$currentHost"/></xsl:message>
    <xsl:choose>
        <xsl:when test="/summary/results[@count eq $currentResult]">
            <xsl:if test="$action='header'">
            <xsl:choose>
              <xsl:when test="$mode='html'">
                <th>
                    <b>Host / SIM</b>
                </th>
             </xsl:when>
             <xsl:otherwise>
                <xsl:text>||Host / SIM||</xsl:text>
             </xsl:otherwise>
             </xsl:choose>
            </xsl:if>
            <xsl:if test="$currentHost">
            <xsl:choose>
            <xsl:when test="$mode='html'">
                <td>
                    <xsl:call-template name="populateSimId">
                        <xsl:with-param name="currentSimResult" select="$currentResult" />
                        <xsl:with-param name="currentSimHost" select="$currentHost" />
                    </xsl:call-template>

                    <b>
                        <xsl:value-of select="$currentHost" />
                    </b>
                </td>
            </xsl:when> 
            <xsl:otherwise>
               TD: |<xsl:value-of select="$currentHost" />                 
            </xsl:otherwise>
            </xsl:choose>
            </xsl:if>
        </xsl:when>
    </xsl:choose>
</xsl:template>

然后用不同的模板完成实际数字(| 23.88 | 60.87 | 9.83 | 13.8):

<xsl:template name="cpu">
    <xsl:param name="action" />
    <xsl:param name="mode" />
    <xsl:param name="currentHost" />
    <xsl:param name="currentResult" />
    <xsl:if test="$action='header'">
        <xsl:call-template name="populateCpuHeader">
            <xsl:with-param name="mode" select="$mode" />
        </xsl:call-template>
    </xsl:if>
    <xsl:choose>
        <xsl:when test="/summary/results[@count eq $currentResult]/server">
            <xsl:variable name="PATH"
                select="/summary/results[@count eq $currentResult]/server[hostname eq $currentHost]/hardwareStats" />
            <xsl:for-each
                select="distinct-values(/summary/results[@count eq $currentResult]/server[child::hardwareStats]/hardwareStats/cpuStats/@type)">
                <xsl:variable name="type" select="." />
                <xsl:variable name="avg"
                    select="$PATH/cpuStats[@type eq $type]/avg/text()" />
                <xsl:variable name="percentile"
                    select="$PATH/cpuStats[@type eq $type]/percentile/text()" />

                <xsl:if test="$action='data'">
                <xsl:choose>
                    <xsl:when test="$mode='html'">
                    <td>
                        <xsl:value-of select="$avg" />
                    </td>
                    <td>
                        <xsl:value-of select="$percentile" />
                    </td>
                    </xsl:when>
                    <xsl:otherwise>
                    | <xsl:value-of select="$avg" />
                    | <xsl:value-of select="$percentile" />
                    </xsl:otherwise>
                </xsl:choose>
                </xsl:if>
            </xsl:for-each>
        </xsl:when>

        <xsl:otherwise>
            <xsl:if test="$action='data'">
                <xsl:call-template name="fillCpuTableCellWithEmptyTag" />
            </xsl:if>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

目前我正在插入TD:&#39;在单元格入口前面,以便我可以稍后在Java中将其拾取并重新格式化,然后将其推送到Confluence:

 List<String> lines = Files.readAllLines(Paths.get("summary.markup"), Charset.defaultCharset());
        StringBuilder b = new StringBuilder();
        StringBuilder rowBuilder = new StringBuilder();
        for(int i=0; i < lines.size(); i++) {
            System.out.println("Line item: " + lines.get(i));
            if(lines.get(i).trim().startsWith("TD:")) {
                String item = Arrays.asList(lines.get(i).split(":")).get(1).trim();
                System.out.println("Item:" + item); 
                rowBuilder.append(item);
            } else {
                b.append(String.format("%s%s", lines.get(i), "\r\n"));
            }
        }  
        rowBuilder.append("|");
        b.append(String.format("%s%s",rowBuilder, "\r\n"));
        page.setContent(b.toString());

随着桌子变得越来越复杂,这将变得混乱。如果我能在XSLT中做到这一点会更好。

一如既往地高度赞赏的想法:)

1 个答案:

答案 0 :(得分:1)

如果使用

编写XSLT代码
        <xsl:otherwise>
           TD: |<xsl:value-of select="$currentHost" />                 
        </xsl:otherwise>

                <xsl:otherwise>
                | <xsl:value-of select="$avg" />
                | <xsl:value-of select="$percentile" />
                </xsl:otherwise>

然后空格和线条在例如将输出 |。您可以明确地使用xsl:text来控制文本,如

<xsl:otherwise>
  <xsl:text>TD: |</xsl:text>
  <xsl:value-of select="$currentHost"/>
</xsl:otherwise>

作为替代方案,当您使用XSLT 2.0 value-of允许输出序列时,您可以尝试例如<xsl:value-of select="'|', $avg, '|', $percentile"/>

最后,在XSLT 1.0和2.0中,您可以使用concat,例如<xsl:value-of select="concat('TD: |', $currentHost)"/>