c# - XSLT 1.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>
您可以看到有多个测试用例,在其之下,测试部件有多个测试部件元素。现在第一个 foreach 正在按预期工作,但内部一个不工作
解决方案
这更像是一个一般性的 XML 问题,但要获得比我上面的评论更完整的答案,我参考了有关焦点的 XSLT 文档,其中说:
[定义:上下文项是当前正在处理的项。项(参见 [XDM 3.0])是原子值(例如整数、日期或字符串)、节点或函数项。每当使用诸如 xsl:apply-templates 和 xsl:for-each 之类的指令来处理一系列项目时,它都会发生变化;这样一个序列中的每个项目在处理该项目时都成为上下文项目。] 上下文项目由 XPath 表达式返回。(点)。
因此,当您输入第一个 for-each 时,上下文已更改,您需要应用相对于该上下文的进一步选择,对于您的示例,将绝对路径更改为内部循环选择的相对路径就足够了:
<xsl:for-each select="testparts/testpart">
推荐阅读
- c# - 带有 ASP.NET Core 控制器/ServiceProviderScope 的 AsyncLocal
- python - 从 Bitmex API json 转换问题读取价格图表
- c - 将一个值增加到特定值,然后再减小到初始起点?
- html - 将 class.bind 与 Aurelia 中 HTML 元素中的原生类结合起来
- .net - 是否可以从 XAF 应用程序的模块中为现有实体提供新字段?
- angular - Api 方法响应在 ngAfterViewInit 之后返回
- c# - 将 .svg 图片添加到幻灯片
- azure - Azure 上的 NVMe SSD
- api - 我发布文件上传(多部分),但它在 swift4 中将空数据发送到 Web 服务
- angular - 大型应用程序的 ngx-translate