0

我有一个要从中创建报告的事务的 xml 转储。(简化的)xml 结构如下所示:

Subject
  id
  name
  license
  event id=key
    result
    eventtype
    date
    action
  charge id=key
    result
    code
    date
 ...etc

每个主题只有一个 ID、名称和许可证;但是可能会有很多事件,并且每个主题都有很多费用——每一个都有不同的结果。

报告输出是一个表格类型,每个主题都有一个名称、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)

4

1 回答 1

0

在 XSLT 中尽可能避免使用 for-each,而是将节点应用于转换模板。

我想出了这个,你可以在这个操场上运行它——不确定它是否是你所追求的。

    <!-- 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>
于 2012-06-22T16:20:22.273 回答