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

