如何重复同名的XSLT子节点?

时间:2012-06-22 15:03:41

标签: xslt

我有一个我要创建报告的事务的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)

1 个答案:

答案 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>