如何修正XSLT以按预期样式展示XML内容?
帮你修正XSLT代码,实现预期的XML展示效果
嘿,刚接触XML和XSLT是容易踩这些小坑,我帮你把代码里的问题逐个理清楚,然后给出修正后的版本~
你当前代码的几个核心问题:
- XPath路径错误:你的模板匹配的是根节点
/,但实际的title、creator等元素都嵌套在digitalLibrarySystem/systemMetadata(或digitalLibrarySystem/aboutRecord)下面,直接写select="title"是找不到节点的,必须补全完整路径。 - 标题样式写法错误:你写的
<h1>"font-weight:bold">完全不符合HTML语法,要给元素加样式得用style属性,而且<h1>标签本身默认就是加粗放大的,也可以额外自定义样式。 - 多subject元素只显示第一个:你的XML里有多个
<subject>,但直接用<xsl:value-of select=".../subject">只会输出第一个匹配的元素内容,需要循环遍历所有subject。 - HTML标签嵌套不合法:
<p>标签里不能嵌套<h4>这类块级标题元素,这会导致渲染异常,得调整结构。
修正后的完整XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <!-- 标题:用h1默认加粗放大,也可以自定义style增强效果 --> <h1 style="font-size: 2.5em; font-weight: 700;"> <xsl:value-of select="digitalLibrarySystem/systemMetadata/title"/> </h1> <!-- 创作者信息 --> <h2> <xsl:value-of select="digitalLibrarySystem/systemMetadata/creator"/> </h2> <!-- 遍历所有subject元素,逐个输出 --> <div style="margin: 1em 0;"> <strong>Subjects:</strong> <xsl:for-each select="digitalLibrarySystem/systemMetadata/subject"> <span style="margin-right: 1em;"> <xsl:value-of select="."/> </span> </xsl:for-each> </div> <!-- 描述内容:用p标签替代嵌套的h4,保证HTML结构合法 --> <p style="font-size: 1.1em; line-height: 1.5;"> <xsl:value-of select="digitalLibrarySystem/systemMetadata/description"/> </p> <!-- 版权信息 --> <p style="margin-top: 1.5em; font-weight: bold;"> Rights: <xsl:value-of select="digitalLibrarySystem/systemMetadata/rights"/> </p> <!-- 记录创建信息:用斜体样式 --> <p style="margin-top: 2em; font-style: italic; color: #666;"> Record created by <xsl:value-of select="digitalLibrarySystem/aboutRecord/recordCreator"/> on <xsl:value-of select="digitalLibrarySystem/aboutRecord/creationDate"/> </p> </body> </html> </xsl:template> </xsl:stylesheet>
关键修改说明:
- 补全XPath路径:所有
select属性都从根节点digitalLibrarySystem开始,确保能正确匹配到目标元素。 - 标题样式优化:给
<h1>添加了自定义的字体大小和加粗样式,完全符合你要的“加粗放大”效果。 - 多subject处理:用
<xsl:for-each>循环遍历所有<subject>元素,把每个主题都展示出来,不会只显示第一个。 - 修复HTML结构:把原来嵌套在
<p>里的<h4>改成了普通<p>标签,调整了排版样式,保证页面渲染正常。 - 细节样式调整:给不同模块添加了间距、字体样式等,让整体展示更接近你预期的效果。
把这个XSLT替换成你的test.xsl,再打开XML文件就能看到符合预期的展示效果啦~
内容的提问来源于stack exchange,提问作者Matthew Weidemann
相关产品推荐
相关产品推荐

