gpt4 book ai didi

xml - 通过将元素列入白名单来清理 SVG 文档

转载 作者:数据小太阳 更新时间:2023-10-29 01:47:47 26 4
gpt4 key购买 nike

我想从一些 SVG 文档中提取大约 20 种元素类型来组成一个新的 SVG。rect, circle, polygon, text, polyline, 基本上是一组视觉零件在白名单中。JavaScript、评论、动画和外部链接需要移除。

我想到了三种方法:

  1. 正则表达式:我完全熟悉,显然不想去那里。
  2. PHP DOM:大概一年前用过一次。
  3. XSLT:我刚才看了一眼。

如果 XSLT 是完成这项工作的正确工具,我需要什么 xsl:stylesheet?否则,您会使用哪种方法?

示例输入:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" version="1.1" width="512" height="512" id="svg2">
<title>Mostly harmless</title>
<metadata id="metadata7">Some metadata</metadata>

<script type="text/ecmascript">
<![CDATA[
alert('Hax!');
]]>
</script>
<style type="text/css">
<![CDATA[ svg{display:none} ]]>
</style>

<defs id="defs4">
<circle id="my_circle" cx="100" cy="50" r="40" fill="red"/>
</defs>

<g id="layer1">
<a xlink:href="www.hax.ru">
<use xlink:href="#my_circle" x="20" y="20"/>
<use xlink:href="#my_circle" x="100" y="50"/>
</a>
</g>
<text>
<tspan>It was the best of times</tspan>
<tspan dx="-140" dy="15">It was the worst of times.</tspan>
</text>
</svg>

示例输出。显示完全相同的图像:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512">
<defs>
<circle id="my_circle" cx="100" cy="50" r="40" fill="red"/>
</defs>
<g id="layer1">
<use xlink:href="#my_circle" x="20" y="20"/>
<use xlink:href="#my_circle" x="100" y="50"/>
</g>
<text>
<tspan>It was the best of times</tspan>
<tspan dx="-140" dy="15">It was the worst of times.</tspan>
</text>
</svg>

keeper 元素的大概列表是:g, rect, circle, ellipse, line, polyline, polygon, path, text, tspan, tref, textpath, linearGradient+stop, radialGradient, defs, clippath, path.

如果不是专门的 SVG tiny,那么肯定是 SVG lite。

最佳答案

这个转换:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:s="http://www.w3.org/2000/svg"
>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="*">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:copy-of select="namespace::xlink"/>

<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>

<xsl:template match="@*">
<xsl:attribute name="{name()}"
namespace="{namespace-uri()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>

<xsl:template match="s:a">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match=
"s:title|s:metadata|s:script|s:style|
s:svg/@version|s:svg/@id"/>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg" version="1.1"
width="512" height="512" id="svg2">
<title>Mostly harmless</title>
<metadata id="metadata7">Some metadata</metadata>
<script type="text/ecmascript"><![CDATA[ alert('Hax!'); ]]></script>
<style type="text/css"><![CDATA[ svg{display:none} ]]></style>
<defs id="defs4">
<circle id="my_circle" cx="100" cy="50" r="40" fill="red"/>
</defs>
<g id="layer1">
<a xlink:href="www.hax.ru">
<use xlink:href="#my_circle" x="20" y="20"/>
<use xlink:href="#my_circle" x="100" y="50"/>
</a>
</g>
<text>
<tspan>It was the best of times</tspan>
<tspan dx="-140" dy="15">It was the worst of times.</tspan>
</text>
</svg>

产生想要的、正确的结果:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512">
<defs id="defs4">
<circle id="my_circle" cx="100" cy="50" r="40" fill="red"/>
</defs>
<g id="layer1">
<use xlink:href="#my_circle" x="20" y="20"/>
<use xlink:href="#my_circle" x="100" y="50"/>
</g>
<text>
<tspan>It was the best of times</tspan>
<tspan dx="-140" dy="15">It was the worst of times.</tspan>
</text>
</svg>

解释:

  1. 两个模板,具有类似于身份规则的组合效果,匹配所有“列入白名单的节点”,并基本上复制它们(仅消除不需要的 namespace 节点)。

  2. 没有正文的模板匹配所有“黑名单”节点(元素和一些属性)。这些被有效地删除了。

  3. 必须有匹配特定“灰名单”节点的模板(在我们的例子中是匹配 s:a 的模板)。 “灰名单节点不会被完全删除——它可能会被重命名或以其他方式修改,或者至少其内容可能仍包含在输出中。

  4. 很可能随着你对问题的理解越来越清晰,三个列表会不断增长,所以修改黑名单删除模板的匹配模式以容纳新发现的黑名单分子。新发现的白名单节点根本不需要任何工作。仅处理新的灰名单元素(如果找到的话)将需要更多的工作。

关于xml - 通过将元素列入白名单来清理 SVG 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4881364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com