XSLT 1.0多结果过滤问题:生成压力测试日志表格
嘿,兄弟!卡了一周搞XSLT 1.0的问题确实够闹心的——这老工具有时候就是倔得很,尤其涉及到非HTML的表格结构时。我来帮你搞定这个用下划线替代制表符的表格生成+过滤需求!
首先,我先假设你的XML大概是这种测试日志结构(如果实际结构不一样,你只需要调整XPath路径就行):
<TestLogs> <LogEntry> <Description>Process Log for Pressure Tests: Step 6 - Pressure Test #1</Description> <Status>Success</Status> <Duration>00:15:30</Duration> </LogEntry> <LogEntry> <Description>Process Log for Pressure Tests: Step 6 - Pressure Test #2</Description> <Status>Failed</Status> <Duration>00:12:10</Duration> </LogEntry> </TestLogs>
基础版:生成带下划线分隔的文本表格
下面是能直接生成你要的[内容]__[截断状态]格式的XSLT 1.0代码,输出纯文本,完全避开HTML:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 输出纯文本,不要任何HTML标签 --> <xsl:output method="text" encoding="UTF-8"/> <!-- 定义列分隔符,这里用2个下划线,你可以随便改数量 --> <xsl:variable name="columnSeparator" select="'__'"/> <xsl:template match="/"> <!-- 遍历日志条目,这里可以加过滤条件!比如只选成功的测试 --> <xsl:for-each select="TestLogs/LogEntry[Status='Success']"> <!-- 输出第一列:完整描述 --> <xsl:value-of select="Description"/> <!-- 输出分隔符 --> <xsl:value-of select="$columnSeparator"/> <!-- 输出第二列:截断成你示例里的S...格式 --> <xsl:value-of select="concat(substring(Status, 1, 1), '...')"/> <!-- 换行,保证每行一条记录 --> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
进阶版:让列对齐更美观
如果你想让列宽固定,比如第一列不管内容长短都占60个字符,不足的地方用下划线补全,那可以加个小模板来实现:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <xsl:template match="/"> <xsl:for-each select="TestLogs/LogEntry"> <!-- 调用补全模板,把描述补到60个字符,不够的加下划线 --> <xsl:call-template name="padToLength"> <xsl:with-param name="text" select="Description"/> <xsl:with-param name="targetLength" select="60"/> <xsl:with-param name="padChar" select="'_'"/> </xsl:call-template> <!-- 加个空格分隔,然后输出截断的状态 --> <xsl:value-of select="concat(' ', substring(Status, 1, 1), '...')"/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> <!-- 递归补全字符串长度的模板 --> <xsl:template name="padToLength"> <xsl:param name="text"/> <xsl:param name="targetLength"/> <xsl:param name="padChar"/> <xsl:value-of select="$text"/> <!-- 如果当前长度不够,继续补下划线 --> <xsl:if test="string-length($text) < $targetLength"> <xsl:call-template name="padToLength"> <xsl:with-param name="text" select="concat($text, $padChar)"/> <xsl:with-param name="targetLength" select="$targetLength"/> <xsl:with-param name="padChar" select="$padChar"/> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet>
关键要点提醒
- 过滤逻辑:在
xsl:for-each的select里加XPath条件就行,比如[Status='Failed']只看失败的,或者[contains(Description, 'Step 6')]只选Step6的日志,完全根据你的需求来。 - 分隔符调整:不管是基础版的
$columnSeparator还是进阶版的补全模板,都可以随便改下划线的数量,适配你要的格式。 - 纯文本输出:一定要把
xsl:output的method设为text,这样就不会生成任何HTML标签,完全符合你的要求。
如果你的XML结构和我假设的不一样,或者还有更具体的过滤规则,直接把你的XML片段贴出来,我再帮你调整!
内容的提问来源于stack exchange,提问作者MegaManX
相关产品推荐
相关产品推荐

