我有一些正在生成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中做到这一点会更好。
一如既往地高度赞赏的想法:)
答案 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)"/>
。