如何用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="'), '"')"/> </rdg> </app> </xsl:template> <!-- 忽略oxy_comment_end处理指令 --> <xsl:template match="processing-instruction('oxy_comment_end')"/> </xsl:stylesheet>
关键说明
- 处理指令匹配:用
processing-instruction('oxy_comment_start')精准匹配目标处理指令,避免语法错误。 - 内容提取:
<lem>的内容:通过following-sibling::text()定位到当前处理指令之后、对应结束指令之前的文本,用<xsl:copy-of>保留原有的空格和换行缩进。<rdg>的内容:因为处理指令的属性不是标准XML属性,无法直接用@comment访问,所以通过字符串截取提取comment属性的值。
- 缩进控制:通过
<xsl:output indent="yes"/>让输出XML自动保留缩进格式。 - 忽略无关处理指令:匹配
oxy_custom_start和oxy_custom_end并空处理,直接忽略这些节点。
测试验证
用你提供的输入示例,运行上述XSLT后,会输出符合要求的结果:
<p> <app> <lem> THIS </lem> <rdg>this: is a comment</rdg> </app> </p>
内容的提问来源于stack exchange,提问作者piah
相关产品推荐
相关产品推荐

