非常重要注意:我正在使用QtXmlPattern(一个没有完全实现的XSLT 2.0处理器,在实现的内容中有一些错误......)
我有一个格式良好的XML文件,其数据在四级数组中定义,如下所示:
<a>
<b>
<c day="20150221">
<d>...</d>
<e>...</e>
</c>
<c day="20150222">
<d>...</d>
<e>...</e>
</c>
<c day="20150223">
<d>...</d>
<e>...</e>
</c>
</b>
<b>
<c day="20150219">
<d>...</d>
<e>...</e>
</c>
<c day="20150221">
<d>...</d>
<e>...</e>
</c>
<c day="20150223">
<d>...</d>
<e>...</e>
</c>
</b>
...
</a>
结果应包括所有日期,但正如我们所看到的,每个 <b>
列表可能有不同的天数 . 然而,结果需要包含所有 <b>
标签的所有日期 . 如果数据不可用,则结果保持为空或零 .
我找到了一种方法来收集变量中的所有日子:
<xsl:variable name="days" select="distinct-values(/a/b/c/@day)"/>
但我不知道如何生成看起来像这样的最终结果:
<table>
<th>
<td>20150219</td>
<td>20150221</td>
<td>20150222</td>
<td>20150223</td>
</th>
<tr>
<td>data from <d> tag on 20150219</td>
<td>data from <d> tag on 20150221</td>
<td>data from <d> tag on 20150222</td>
<td>data from <d> tag on 20150223</td>
</tr>
...[repeat for various data and calculation on the data]...
</table>
我的问题是变量不是节点列表,只是一个字符串列表,我不太清楚如何循环遍历字符串列表 .
为了以防万一,对于那些不了解QXmlQuery解析器的人, xsl:for-each-group
命令不存在 .
2 回答
我不确定你需要什么,但有时候对尝试解决方案的评论比试图解释更容易 . 您必须使用密钥来查找不同的属性值 .
不要循环遍历字符串列表,而是通过一系列
c
元素,这些元素相对于它们的day
属性的值是唯一的(最后,它们是相同的) . 我使用的技术由Jeni Tennison here描述,因为它通常用于分组问题 .XML Input
在我看来,合理的输入包括
d
元素的实际值:Stylesheet
HTML Output
我仍然不清楚如果同一天有多个
d
元素会发生什么 .试试这个解决方案online on xsltransform .
你可以(使用XSLT 2.0,不确定你所选择的处理器是否支持那个)
将主文档节点存储在稍后将要使用的变量中,然后定义一个键
然后在一天中引用
d
项目那个带有三个参数的
key()
调用在XSLT 2.0中是新的,如果不支持则尝试如果
key
函数不可用,那么您需要将引用写为例如