使用Ant的replaceregexp移除SVG热点后,如何消除遗留空行?
最优解决方案:用XSLT 1.0处理SVG结构
别纠结正则了,XML/SVG是结构化文档,正则天生不适合处理这类嵌套标签场景,反而XSLT能精准处理,效率也不会比正则差多少,还能避免空行、标签嵌套错误等问题。
步骤1:编写XSLT转换样式表(remove-svg-a.xsl)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 复制所有节点和属性,除了<a>标签本身 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配<a>标签,直接输出其子元素,跳过<a>标签本身 --> <xsl:template match="a"> <xsl:apply-templates select="@*|node()"/> </xsl:template> </xsl:stylesheet>
步骤2:在Ant中配置XSLT任务
用Ant的<xslt>标签调用上面的样式表,批量处理SVG文件,不会产生多余空行:
<target name="remove-svg-a"> <xslt basedir="src/svg" destdir="dist/svg" style="remove-svg-a.xsl" includes="**/*.svg"/> </target>
为什么比正则好?
- 精准处理SVG的XML结构,不会因为
<a>标签带属性(比如<a xlink:href="xxx">)、嵌套子标签等情况出错 - 一次转换完成,不需要多段正则,效率更稳定
- 天然保留原文档的格式(不会莫名多出空行),除非你特意在XSLT里加格式处理
如果你非要用Ant正则优化(不推荐)
如果坚持用正则,试试合并成单段正则替换,同时处理<a>标签和可能的空行:
<replaceregexp match="<a[^>]*>\s*|\s*</a>" replace="" flags="gs" byline="false"> <fileset dir="src/svg" includes="**/*.svg"/> </replaceregexp>
不过要注意:如果SVG里的文本内容包含类似<a的字符串,或者<a>标签跨多行,这种正则还是会出问题,只能处理简单场景。
内容的提问来源于stack exchange,提问作者Caroline
相关产品推荐
相关产品推荐

