我有一个我要创建报告的事务的xml转储。 (简化的)xml结构如下所示:
Subject
id
name
license
event id=key
result
eventtype
date
action
charge id=key
result
code
date
...etc
每个主题只有一个ID,名称和许可证;但是可能会有很多事件,并且每个主题都会收取很多费用 - 每个主题都有不同的结果。
报告输出是一种表类型,每个主题都有标题名称,标识,许可证和标题下方列出的多个数据事务块。每个数据块具有基于事务类型的不同值和结构。
它适用于标题和每种数据事务类型,但只打印出第一个事件事务和第一个计费事务。
(简化的)xsl看起来像:
<xsl:for-each select="file/subject">
<xsl:if test="not (@subject = preceding-sibling::subject[1])">
<table width="754" border="2" cellpadding="0">
<tr>
<td width="172">ctn: <strong><xsl:value-of select="id"/></strong></td>
<td width="364">defendant: <strong><xsl:value-of select="name"/></strong></td>
<td width="200">sid: <strong><xsl:value-of select="license"/></strong></td>
</tr>
</table>
</xsl:if>
<blockquote>
<xsl:if test="event/eventType != ' '">
<table width="695" border="1">
<tr>
<td>Event<xsl:value-of select="event/result"/></td>
<td>Eventtype<xsl:value-of select="event/eventtype"/></td>
<td>Date<xsl:value-of select="event/date"/></td>
</tr>
</table>
</xsl:if>
<xsl:if test="charge/code != ' '">
<table width="695" border="1">
<tr>
<td>Charge<xsl:value-of select="charge/result"/></td>
<td>Code<xsl:value-of select="charge/code"/></td>
<td>Date<xsl:value-of select="charge/date"/></td>
</tr>
</table>
</xsl:if>
</blockquote>
</xsl:for-each>
我假设我需要一个额外的for-each来扫描子节点,但是添加额外的循环只会给我标题。
有什么想法吗?
(感谢花时间阅读这篇文章。:o)
答案 0 :(得分:0)
在XSLT中尽可能避免for-each并将节点应用于转换模板。
我想出了这个,你可以在this playground session运行 - 不确定它是否与你所追求的完全相同。
<!-- root and static content -->
<xsl:template match="/">
<xsl:apply-templates select='root/Subject' />
</xsl:template>
<!-- iteration content: subject -->
<xsl:template match='Subject'>
<table>
<tr>
<td>ctn: <strong><xsl:value-of select="id"/></strong></td>
<td>defendant: <strong><xsl:value-of select="name"/></strong></td>
<td>sid: <strong><xsl:value-of select="license"/></strong></td>
</tr>
</table>
<xsl:apply-templates select='event' />
<xsl:apply-templates select='charge' />
</xsl:template>
<!-- iteration content: event -->
<xsl:template match='event'>
<blockquote>
<table>
<tr>
<td>Event: <xsl:value-of select="result"/></td>
<td>Event type: <xsl:value-of select="eventtype"/></td>
<td>Date: <xsl:value-of select="date"/></td>
</tr>
</table>
</blockquote>
</xsl:template>
<!-- iteration content: charge -->
<xsl:template match='charge'>
<blockquote>
<table>
<tr>
<td>Charge: <xsl:value-of select="result"/></td>
<td>Code: <xsl:value-of select="code"/></td>
<td>Date: <xsl:value-of select="date"/></td>
</tr>
</table>
</blockquote>
</xsl:template>