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

如何使用XSL将XML中<year>元素转换为对应多列?

解决XSL将每个转为单独列的问题

嘿,刚上手XSL遇到这种子元素拆分列的问题太正常了,我帮你调整代码,完美实现你要的效果~

问题根源

你原来的代码<xsl:for-each select="years">是选中整个<years>节点,然后<xsl:value-of select="."/>会把该节点下所有文本(也就是所有year值)合并输出到一个<td>里,自然没法拆分成单独列。我们需要循环遍历每个<year>子元素,同时处理表头和不同cd的year数量不一致的情况。

完整XSL实现代码

下面是适配你XML结构的完整XSL,能生成你期望的表头和分列数据:

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

  <!-- 先获取所有cd中最多的year数量,这里取第一个cd的year数适配你的示例,也可动态计算 -->
  <xsl:variable name="maxYearCount" select="count(/catalog/cd[1]/years/year)"/>

  <xsl:template match="/">
    <html>
      <body>
        <table border="1">
          <!-- 生成表头 -->
          <tr>
            <th>Title</th>
            <th>Artist</th>
            <th>Country</th>
            <th>Company</th>
            <th>Price</th>
            <xsl:for-each select="1 to $maxYearCount">
              <th>Year<xsl:value-of select="."/></th>
            </xsl:for-each>
          </tr>

          <!-- 遍历每个cd生成数据行 -->
          <xsl:for-each select="catalog/cd">
            <tr>
              <td><xsl:value-of select="title"/></td>
              <td><xsl:value-of select="artist"/></td>
              <td><xsl:value-of select="country"/></td>
              <td><xsl:value-of select="company"/></td>
              <td><xsl:value-of select="price"/></td>
              <!-- 循环生成对应数量的year列,没有对应year则留空 -->
              <xsl:for-each select="1 to $maxYearCount">
                <td><xsl:value-of select="years/year[position()=current()]"/></td>
              </xsl:for-each>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

关键细节说明

  1. 动态表头生成:用1 to $maxYearCount循环生成Year1、Year2、Year3的表头列。如果要适配任意数量的year(不止3个),XSLT2.0及以上可以用max(/catalog/cd/count(years/year))动态获取最大值,XSLT1.0可以用递归逻辑实现。
  2. 分列输出year:在每个cd的行里,同样循环1到最大year数,用position()=current()匹配对应位置的year元素,没有该位置的year时,会自动输出空的<td>,完全符合你要的格式。
  3. 原代码修正:把原来针对<years>节点的循环,改成针对每个<year>位置的循环,就能让每个year单独占一列。

最终效果

生成的HTML表格会和你期望的完全一致:

Title               Artist        Country Company      Price Year1 Year2 Year3
Empire Burlesque    Bob Dylan     USA     Columbia     10.90 1985  1986  1987
Hide your heart     Bonnie Tyler  UK      CBS Records  9.90  1988  1988

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:18:53