我有一个相当简单的XSLT:
open
目标是采用类似于
的SVG文件<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="svg">
<svg>
<xsl:apply-templates />
</svg>
</xsl:template>
<xsl:template match="circle">
<xsl:copy-of select='.'/>
</xsl:template>
</xsl:stylesheet>
并制作
<?xml version="1.0" standalone="no"?>
<svg width="200" height="250" version="1.1" xmlns="http://www.w3.org/2000/svg">
<rect x="10" y="10" width="30" height="30" stroke="black" fill="transparent" stroke-width="5"/>
<circle cx="25" cy="75" r="20" stroke="red" fill="transparent" stroke-width="5"/>
<ellipse cx="75" cy="75" rx="20" ry="5" stroke="red" fill="transparent" stroke-width="5"/>
<line x1="10" x2="50" y1="110" y2="150" stroke="orange" fill="transparent" stroke-width="5"/>
<polyline points="60 110 65 120 70 115 75 130 80 125 85 140 90 135 95 150 100 145"
stroke="orange" fill="transparent" stroke-width="5"/>
<polygon points="50 160 55 180 70 180 60 190 65 205 50 195 35 205 40 190 30 180 45 180"
stroke="green" fill="transparent" stroke-width="5"/>
<circle cx="35" cy="75" r="20" stroke="red" fill="transparent" stroke-width="5"/>
<path d="M20,230 Q40,205 50,230 T90,230" fill="none" stroke="blue" stroke-width="5"/>
</svg>
换句话说,我想要一个仅包含此图像圆圈的SVG。
由于某些原因<svg>
<circle cx="25" cy="75" r="20" stroke="red" fill="transparent" stroke-width="5"/>
<circle cx="35" cy="75" r="20" stroke="red" fill="transparent" stroke-width="5"/>
</svg>
条款似乎不起作用。我尝试用match
代替match="svg"
,并且已成功生成match="/"
代码,但它是空的,因为没有圈子匹配。
很可能,这是我在这里失踪的非常简单的事情。
答案 0 :(得分:2)
脚本失败的基本原因(模板不匹配)是:
http://www.w3.org/2000/svg
命名空间,为了使您的匹配正确,您必须:
xmlns:sv="http://www.w3.org/2000/svg"
添加到stylesheet
代码sv:
。另一个变化:
exclude-result-prefixes="sv"
以防止添加名称空间
主输出标签。select="sv:circle"
中将apply-templates
添加到svn
,
将子内容的处理限制为仅circle
标记。我还更改了匹配circle
的模板。原因是要创造
拥有 circle
标记(没有命名空间),就像您在模板中所做的那样
匹配svg
。
所以整个脚本可能如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:sv="http://www.w3.org/2000/svg"
exclude-result-prefixes="sv">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="sv:svg">
<svg>
<xsl:apply-templates select="sv:circle"/>
</svg>
</xsl:template>
<xsl:template match="sv:circle">
<circle>
<xsl:apply-templates select="@*|node()"/>
</circle>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
</xsl:stylesheet>