【发布时间】:2013-12-12 15:40:52
【问题描述】:
我有一些看起来像这样的 svg 代码:
<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px">
<g id="outer">
<g id="inner-1">
<defs>
<rect/>
</defs>
<clipPath></clipPath>
<polygon/>
</g>
<text>Some</text>
<text>Text</text>
<g id="inner-2">
<defs>
<rect/>
</defs>
<clipPath></clipPath>
<polygon/>
</g>
<text>Some</text>
<text>Text</text>
<text>Some</text>
<text>Text</text>
<g id="inner-3">
<defs>
<rect/>
</defs>
<clipPath></clipPath>
<polygon/>
</g>
<text>Keep this text</text>
<text>Keep this text</text>
</g>
</svg>
如何删除第二次和第三次出现的内部<g> 标记和第一个内部<g> 之后的<text> 标记,以及第二个内部<g> 之后的<text> 标记。我可以在<g>tag 之后有nth 个<text> 标签,但我将始终“删除”(不是通过覆盖身份转换来选择)第二个内部<g> 标签和之前的文本,并且第三个内部 <g> 标签和之前的文本。
我只想要第 1 次出现的内部 '' 标记和第 3 次出现的内部 '' 标记之后的 <text> 标记。它应该是这样的:
<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px">
<g id="outer">
<g id="inner-1">
<defs>
<rect/>
</defs>
<clipPath></clipPath>
<polygon/>
</g>
<text>Keep this text</text>
<text>Keep this text</text>
</g>
</svg>
这是我想出的:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- I don't know how to select preceding text -->
<xsl:template match="/svg/g/g[2]"/>
<!-- I don't know how to select preceding text -->
<xsl:template match="/svg/g/g[3]"/>
</stylesheet>
我尝试使用此代码来转换第三个 <g> 标记之后的文本元素:
<xsl:template match="svg:text">
<xsl:choose>
<xsl:when test="(following::svg:g[3])[parent::svg:g]">
<xsl:copy-of select="."/>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:template>
...那没有用。
【问题讨论】:
-
请花点时间亲自尝试一下并分享您的样式表。如果您曾经针对 XSLT 处理器运行过输入 XML,您就会知道它的格式不正确。
-
@Mathias 我已经运行了它,但忘记包含我的 xslt 代码。我编辑了上面的代码以取出敏感数据。