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

XSLT转换XML时category内容丢失问题求助

你的XSLT代码错误分析与修复方案

问题出在你处理<category>元素的循环逻辑里,咱们拆解来看:

在这段代码中:

<xsl:for-each select="categories/category">
  <xsl:element name="category">
    <xsl:value-of select="category"/>
  </xsl:element>
</xsl:for-each>

当你用<xsl:for-each select="categories/category">遍历的时候,当前的上下文节点已经是每一个<category>元素了。这时候你写<xsl:value-of select="category"/>,是在当前的<category>节点下去找名为category的子节点——但你的原XML里<category>都是叶子节点,没有子节点,所以自然取不到任何内容,最终生成空的<category/>标签。

快速修复方案:

把select="category"改成select=".",.代表当前上下文节点的文本内容,修改后这部分代码变成:

<xsl:for-each select="categories/category">
  <xsl:element name="category">
    <xsl:value-of select="."/>
  </xsl:element>
</xsl:for-each>

更简洁的优化写法(推荐):

其实XSLT更适合用模板匹配来处理节点,而非手动循环,这样代码更易维护。你可以把原代码重构为下面的形式,省去手动创建元素的冗余操作:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 匹配根节点Books,复制结构并处理子节点 -->
  <xsl:template match="Books">
    <Books>
      <xsl:apply-templates />
    </Books>
  </xsl:template>

  <!-- 匹配book节点,转换属性为子元素并处理categories -->
  <xsl:template match="book">
    <book>
      <bookID><xsl:value-of select="@bookID"/></bookID>
      <xsl:apply-templates select="categories"/>
    </book>
  </xsl:template>

  <!-- 匹配categories节点,保留结构并处理子category -->
  <xsl:template match="categories">
    <categories>
      <xsl:apply-templates select="category"/>
    </categories>
  </xsl:template>

  <!-- 匹配category节点,直接复制整个节点(含文本内容) -->
  <xsl:template match="category">
    <xsl:copy-of select="."/>
  </xsl:template>
</xsl:stylesheet>

这种写法利用XSLT的模板匹配机制,逻辑更清晰,不管你有多少本书,都能正确将bookID属性转为子元素,同时完整保留所有<category>的内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:34:24