XSLT1.0-用HTML包装的多个子节点模板



我在从XML进行XSLT转换时遇到了一些For Each问题。XML包含多个子节点:

<?xml version="1.0" encoding="utf-8"?>
<testsuites duration="6376 ms">
<testsuite>
<testcase>
<testid>A1</testid>
<package>Package 1</package>
<test>Test 1</test>
<duration>2 ms</duration>
<failures>0</failures>
<pass>4</pass>
<testparts>
<testpart>
<time>2020-08-23-17-03-24</time>
<status>Test passed</status>
<test>Assertion 1</test>
</testpart>
<testpart>
<time>2020-08-23-17-03-24</time>
<status>Test passed</status>
<test>Assertion 2</test>
</testpart>
<testpart>
<time>2020-08-23-17-03-24</time>
<status>Test passed</status>
<test>Assertion 3</test>
</testpart>
</testparts>
</testcase>
</testsuite>
.......

XSLT文件为:

<?xml version="1.0" encoding="utf-8"?> 
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta charset="utf-8" />
...Some styles and scripts
</head>
<body>
<div>
<xsl:for-each select="testsuites/testsuite/testcase">
<span class="column1"><xsl:value-of select="duration"/></span>
<span class="PackageStatus"><xsl:value-of select="package"/></span>
<span class="Function"><xsl:value-of select="test"/></span>
<span class="Message" name="ID0AFH0IHId"><xsl:value-of select="failures"/></span>
<span class="Message" name="ID0AFH0IHId"><xsl:value-of select="pass"/></span>
<span class="Message" name="ID0AFH0IHId"><xsl:value-of select="pass"/>Show Assertions</span>

<div>
<xsl:for-each select="testsuites/testsuite/testcase/testparts/testpart">
<span class="column1"><xsl:value-of select="time"/></span>
<span class="passed"><xsl:value-of select="status"/></span>
<span class="Function"><xsl:value-of select="test"/></span>
</xsl:for-each>
</div>
</xsl:for-each>
</div>
</body>
</html>

您可以看到有多个测试用例,在这些用例下面,测试部分有多个testpart元素。现在,第一个前臂按预期工作,但内部前臂不工作

这更像是一个普通的XML问题,但要获得比我上面的评论更完整的答案,我可以参考XSLT文档中关于焦点的内容,其中写道:

[定义:上下文项是当前正在处理的项。项(参见[XDM 3.0](是原子值(例如整数,日期或字符串(、节点或函数项。它随时更改xsl:apply-templates和xsl:for-each等指令用于处理一系列项目;这样一个序列中的每个项目都成为上下文项。]上下文项为XPath表达式返回。(点(。

因此,当您为每个上下文输入第一个时,上下文已经更改,您需要针对该上下文应用进一步的选择,例如,对于您的示例,从绝对路径更改为内部循环的选择的相对路径就足够了:

<xsl:for-each select="testparts/testpart">

最新更新