如何用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('<root>', normalize-space(.), '</root>'))/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(如<ul>),parse-xml()函数可将其解析为真实的XML节点树 - 用
concat('<root>', normalize-space(.), '</root>')给转义文本包裹根节点,确保解析时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
相关产品推荐
相关产品推荐

