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

如何用XSLT将?oxy_comment_start转换为合法XML标签?

如何用XSLT 2.0将Oxygen处理指令转换为合法XML标签

你需要把Oxygen的<?oxy_comment_start?>/<?oxy_comment_end?>处理指令对转换成<app>包裹的<lem>和<rdg>结构,同时忽略<?oxy_custom_start?>/<?oxy_custom_end?>,还要保留缩进。你当前的模板匹配语法错误,导致报错。

错误原因

你写的<xsl:template match="?oxy_comment_start">是错误语法,XSLT中匹配**处理指令(Processing Instruction)**必须用processing-instruction()函数指定目标名称,正确写法是processing-instruction('oxy_comment_start')。

完整解决方案

下面是符合需求的XSLT 2.0代码,包含处理指令匹配、内容提取、缩进控制:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 开启输出缩进,保留格式 -->
    <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

    <!-- 匹配根节点,递归处理所有子节点 -->
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>

    <!-- 匹配普通元素,保留结构并处理子节点 -->
    <xsl:template match="*">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <!-- 忽略不需要的oxy_custom处理指令 -->
    <xsl:template match="processing-instruction('oxy_custom_start') | processing-instruction('oxy_custom_end')"/>

    <!-- 处理oxy_comment_start处理指令,生成app结构 -->
    <xsl:template match="processing-instruction('oxy_comment_start')">
        <app>
            <lem>
                <!-- 提取oxy_comment_start和oxy_comment_end之间的文本内容,保留原格式 -->
                <xsl:copy-of select="following-sibling::text()[
                    preceding-sibling::processing-instruction('oxy_comment_start')[1] = current()
                    and not(following-sibling::processing-instruction('oxy_comment_end')[1])
                ]"/>
            </lem>
            <rdg>
                <!-- 提取comment属性值 -->
                <xsl:value-of select="substring-before(substring-after(., 'comment=&quot;'), '&quot;')"/>
            </rdg>
        </app>
    </xsl:template>

    <!-- 忽略oxy_comment_end处理指令 -->
    <xsl:template match="processing-instruction('oxy_comment_end')"/>
</xsl:stylesheet>

关键说明

  1. 处理指令匹配:用processing-instruction('oxy_comment_start')精准匹配目标处理指令,避免语法错误。
  2. 内容提取:
    • <lem>的内容:通过following-sibling::text()定位到当前处理指令之后、对应结束指令之前的文本,用<xsl:copy-of>保留原有的空格和换行缩进。
    • <rdg>的内容:因为处理指令的属性不是标准XML属性,无法直接用@comment访问,所以通过字符串截取提取comment属性的值。
  3. 缩进控制:通过<xsl:output indent="yes"/>让输出XML自动保留缩进格式。
  4. 忽略无关处理指令:匹配oxy_custom_start和oxy_custom_end并空处理,直接忽略这些节点。

测试验证

用你提供的输入示例,运行上述XSLT后,会输出符合要求的结果:

<p>
   <app>
      <lem>
    THIS
   </lem>
      <rdg>this: is a comment</rdg>
   </app>
</p>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:43:18