You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用XSLT 1.0处理含CDATA的XML,按用户生成独立表格?

解决XSLT 1.0按用户生成独立表格的问题

核心实现思路

用Muenchian分组(XSLT 1.0标准分组方案)按用户唯一标识(比如Guest ID)分组,为每个分组生成独立表格;直接通过xsl:value-of读取CDATA包裹的内容,无需额外处理。

示例XML结构(模拟你的数据格式)

<Root>
  <AccessRecord>
    <Guest><![CDATA[G001 - John Doe]]></Guest>
    <GuestID><![CDATA[G001]]></GuestID>
    <AccessType><![CDATA[Door Access]]></AccessType>
    <AccessDescription><![CDATA[Main Entrance, 9AM-5PM]]></AccessDescription>
  </AccessRecord>
  <AccessRecord>
    <Guest><![CDATA[G001 - John Doe]]></Guest>
    <GuestID><![CDATA[G001]]></GuestID>
    <AccessType><![CDATA[Parking Access]]></AccessType>
    <AccessDescription><![CDATA[Underground Lot, 24/7]]></AccessDescription>
  </AccessRecord>
  <AccessRecord>
    <Guest><![CDATA[G002 - Jane Smith]]></Guest>
    <GuestID><![CDATA[G002]]></GuestID>
    <AccessType><![CDATA[Conference Room Access]]></AccessType>
    <AccessDescription><![CDATA[Room 301, 8AM-6PM]]></AccessDescription>
  </AccessRecord>
</Root>

对应的XSLT 1.0代码

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" indent="yes"/>

  <!-- Muenchian分组:按GuestID作为唯一标识分组 -->
  <xsl:key name="guestGroup" match="AccessRecord" use="GuestID"/>

  <xsl:template match="/">
    <html>
      <body>
        <!-- 遍历每个唯一的用户分组 -->
        <xsl:for-each select="Root/AccessRecord[generate-id() = generate-id(key('guestGroup', GuestID)[1])]">
          <!-- 存储当前用户的信息 -->
          <xsl:variable name="currentGuestInfo" select="Guest"/>
          <xsl:variable name="currentGuestID" select="GuestID"/>

          <!-- 表格顶部的用户标题 -->
          <h3>Guest: <xsl:value-of select="$currentGuestInfo"/></h3>

          <!-- 生成独立表格 -->
          <table border="1">
            <thead>
              <tr>
                <th>Access Type</th>
                <th>Access Description</th>
              </tr>
            </thead>
            <tbody>
              <!-- 遍历当前用户下的所有权限记录 -->
              <xsl:for-each select="key('guestGroup', $currentGuestID)">
                <tr>
                  <td><xsl:value-of select="AccessType"/></td>
                  <td><xsl:value-of select="AccessDescription"/></td>
                </tr>
              </xsl:for-each>
            </tbody>
          </table>
          <!-- 表格间的分隔 -->
          <br/>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

关键说明

  1. Muenchian分组逻辑:通过xsl:key定义分组规则,再用generate-id()判断当前节点是否为分组的第一个节点,确保每个用户只生成一次表格框架。
  2. CDATA处理:XSLT 1.0会自动解析CDATA段内的文本,直接用xsl:value-of即可读取内容,无需额外转换。
  3. 表格标题调整:如果想把用户信息放在表格内部,可替换<h3>为表格的<caption>标签:
    <table border="1">
      <caption>Guest: <xsl:value-of select="$currentGuestInfo"/></caption>
      <!-- 表头和内容... -->
    </table>
    
  4. 通用适配:如果你的XML中用户唯一标识不是GuestID,只需修改xsl:key的use属性和后续引用的字段即可。

内容的提问来源于stack exchange,提问作者MPourier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:42:37