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

如何用XSLT的parse-xml转换XML节点?求XSLT3.0在线测试工具

Access导出XML的XSLT 3.0转换方案

需求说明

需要处理Access导出的XML,通过XSLT 3.0(Saxon 9.8)完成以下操作:

  • 将<Description>节点内的转义HTML文本转换为XML节点(如把转义的<ul>/<li>转为<unorderedlist>/<listitem>)
  • 移除文本中的<div>和<font>标签,保留内容
  • 调整XML结构,将<TEQuery>转为<TaxExpenditure>并提取属性
  • 找到支持XSLT 3.0的在线测试工具

修改后的完整XSLT代码

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

  <!-- 身份模板:默认复制所有节点和属性 -->
  <xsl:template match="/ | @* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
  </xsl:template>

  <!-- 转换TEQuery为TaxExpenditure -->
  <xsl:template match="TEQuery">
    <TaxExpenditure id="{IntID}" TAXSORT="{TaxSort}">
      <xsl:value-of select="TEName"/>
      <xsl:apply-templates select="node()" />
    </TaxExpenditure>
  </xsl:template>

  <!-- 隐藏不需要保留的节点 -->
  <xsl:template match="IntID | TaxSort | TEName"/>

  <!-- 处理Description节点,解析转义文本并转换格式 -->
  <xsl:template match="Description">
    <Description>
      <!-- 解析转义的HTML文本为XML节点树,包裹根节点确保合法解析 -->
      <xsl:apply-templates select="parse-xml(concat('&lt;root&gt;', normalize-space(.), '&lt;/root&gt;'))/node()" mode="html-to-fm"/>
    </Description>
  </xsl:template>

  <!-- 模式:将HTML标签转换为FrameMaker兼容的标签 -->
  <xsl:template match="div | font" mode="html-to-fm">
    <!-- 移除div和font标签,直接输出子内容 -->
    <xsl:apply-templates select="node()" mode="html-to-fm"/>
  </xsl:template>

  <!-- 将所有层级的ul转换为单个unorderedlist -->
  <xsl:template match="ul" mode="html-to-fm">
    <!-- 只在最外层ul生成unorderedlist,避免重复嵌套 -->
    <xsl:if test="not(ancestor::ul)">
      <unorderedlist>
        <!-- 提取所有后代li节点 -->
        <xsl:apply-templates select=".//li" mode="html-to-fm"/>
      </unorderedlist>
    </xsl:if>
  </xsl:template>

  <!-- 将li转换为listitem -->
  <xsl:template match="li" mode="html-to-fm">
    <listitem>
      <xsl:apply-templates select="node()" mode="html-to-fm"/>
    </listitem>
  </xsl:template>

  <!-- 保留文本内容 -->
  <xsl:template match="text()" mode="html-to-fm">
    <xsl:value-of select="."/>
  </xsl:template>
</xsl:stylesheet>

关键功能说明

1. 转义文本转节点:parse-xml的用法

  • 原<Description>内的文本是转义的HTML(如&lt;ul&gt;),parse-xml()函数可将其解析为真实的XML节点树
  • 用concat('&lt;root&gt;', normalize-space(.), '&lt;/root&gt;')给转义文本包裹根节点,确保解析时XML结构合法
  • 通过mode="html-to-fm"单独处理解析后的HTML节点,避免影响原XML的其他部分

2. 移除<div>和<font>标签

  • 匹配div和font节点时,直接应用模板处理其子节点,不输出标签本身,实现“移除标签保留内容”的效果

3. 多层<ul>转换为单个<unorderedlist>

  • 原XML中存在多层嵌套的<ul>,通过not(ancestor::ul)判断只在最外层<ul>生成<unorderedlist>
  • 用.//li提取所有后代<li>节点,解决嵌套层级冗余问题

支持XSLT 3.0的在线测试工具

  • SaxonJS在线编辑器:基于Saxon引擎,完全兼容XSLT 3.0
  • XML Playground:提供XSLT 3.0测试环境,集成Saxon解析器
  • Saxon官方在线测试工具:直接使用Saxon 9.x版本进行验证

测试效果

使用上述XSLT处理输入XML后,将生成符合需求的输出:<TEQuery>转为<TaxExpenditure>并携带指定属性,<Description>内的转义列表转为<unorderedlist>/<listitem>结构,同时自动移除<div>和<font>标签。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:10:54