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

如何修正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>

关键修改说明:

  1. 补全XPath路径:所有select属性都从根节点digitalLibrarySystem开始,确保能正确匹配到目标元素。
  2. 标题样式优化:给<h1>添加了自定义的字体大小和加粗样式,完全符合你要的“加粗放大”效果。
  3. 多subject处理:用<xsl:for-each>循环遍历所有<subject>元素,把每个主题都展示出来,不会只显示第一个。
  4. 修复HTML结构:把原来嵌套在<p>里的<h4>改成了普通<p>标签,调整了排版样式,保证页面渲染正常。
  5. 细节样式调整:给不同模块添加了间距、字体样式等,让整体展示更接近你预期的效果。

把这个XSLT替换成你的test.xsl,再打开XML文件就能看到符合预期的展示效果啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:29:38