如何用XSLT将DTD验证的XML按用户生成单个XHTML文件?
使用XSLT为每个用户生成单独的XHTML文件(结合
for-each实现) 嗨,我来帮你搞定这个需求!要实现每个用户输出一个独立XHTML文件,你需要结合xsl:for-each遍历用户节点,再用XSLT 2.0及以上版本支持的xsl:result-document来生成单独文件——这是最直接的方案,下面给你完整的实现代码和细节解释:
完整XSLT转换代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 匹配根节点,开始处理 --> <xsl:template match="/"> <!-- 遍历每个user节点 --> <xsl:for-each select="/store/users/user"> <!-- 生成单独的XHTML文件,文件名用用户id区分 --> <xsl:result-document method="xhtml" href="user-{@id}.html" encoding="UTF-8"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"/> <title>用户信息:<xsl:value-of select="name"/></title> </head> <body> <h1>用户详情</h1> <div> <p><strong>用户ID:</strong><xsl:value-of select="@id"/></p> <p><strong>用户名:</strong><xsl:value-of select="name/@username"/></p> <p><strong>真实姓名:</strong><xsl:value-of select="name"/></p> <p><strong>邮箱:</strong><xsl:value-of select="email"/></p> <p><strong>手机号:</strong><xsl:value-of select="mob_number"/></p> <p><strong>地址:</strong><xsl:value-of select="address"/></p> </div> </body> </html> </xsl:result-document> </xsl:for-each> </xsl:template> </xsl:stylesheet>
关键部分解释
- XSLT版本声明:必须指定
version="2.0",因为xsl:result-document是2.0新增的功能,常用的处理器比如Saxon完全支持这个版本。 xsl:for-each遍历:select="/store/users/user"会选中所有用户节点,循环体里的代码会对每个用户执行一次。- 生成独立文件:
xsl:result-document的href属性定义输出文件名,这里用user-{@id}.html,会生成比如user-user1.html、user-user2.html这样的文件,确保每个文件唯一。 - XHTML内容构建:在
xsl:result-document内部,你可以像写普通XHTML一样构建页面,用xsl:value-of提取用户的各个字段值,包括属性(比如name/@username是取name节点的username属性)。
运行方式
你需要用支持XSLT 2.0的处理器来执行转换,比如Saxon:
# 假设你的XML文件叫input.xml,XSLT文件叫transform.xsl java -jar saxon9he.jar -s:input.xml -xsl:transform.xsl
执行后,你会在当前目录下看到每个用户对应的XHTML文件。
注意事项
如果你的环境只能用XSLT 1.0,那没法直接生成多个文件,需要借助处理器的扩展功能(比如Xalan的exslt:document)或者其他工具,但还是推荐用XSLT 2.0+,实现起来更简洁可靠。
内容的提问来源于stack exchange,提问作者Arman Freitas
相关产品推荐
相关产品推荐

