2016-05-17 78 views
2

我需要一个bash脚本来处理和编辑PDF文件。使用XSL删除SVG中的元素使用XSL

我已经成功将PDF文件转换为SVG,并且现在正尝试从该SVG中移除我不需要的东西。

下面是该文件的一个示例中,我想编辑:

<?xml version="1.0" encoding="UTF-8"?> 
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="595pt" height="842pt" viewBox="0 0 595 842" version="1.1"> 
<defs> 
<g> 
<symbol overflow="visible" id="glyph0-0"> 
<path style="stroke:none;" d=""/> 
</symbol> 
<symbol overflow="visible" id="glyph0-1"> 
<path style="stroke:none;" d=""/> 
</symbol> 
<symbol overflow="visible" id="glyph0-2"> 
<path style="stroke:none;" d="M 4.90625 -5.71875 C 4.453125 -6.171875 3.953125 -6.359375 3.296875 -6.359375 -5.71875 "/> 
</symbol> 
<symbol overflow="visible" id="glyph1-1"> 
<path style="stroke:none;" d="M 3.859375 -7.34375 L 1.625 -6.640625 C 1.4375 -6.59375 1.375 -6.515625 1.375 -6.390625"/> 
</symbol> 
</g> 
</defs> 
</svg> 

我想删除其中id为“glyph0”开头的所有“符号”的节点,这意味着我会得到下面的输出:

<?xml version="1.0" encoding="UTF-8"?> 
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="595pt" height="842pt" viewBox="0 0 595 842" version="1.1"> 
<defs> 
<g> 
<symbol overflow="visible" id="glyph1-1"> 
<path style="stroke:none;" d="M 3.859375 -7.34375 L 1.625 -6.640625 C 1.4375 -6.59375 1.375 -6.515625 1.375 -6.390625"/> 
</symbol> 
</g> 
</defs> 
</svg> 

我已经使用下面的XSL文件,删除glyph0-0入口(起初)尝试:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="svg/defs/g/symbol[id='glyph0-0']"/> 
</xsl:stylesheet> 

当我使用xsltproc应用此过滤器时,它什么也不做。这是为了去除glyph0-0:

$xsltproc test-3.xsl test.svg | head 
<?xml version="1.0"?> 
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="595pt" height="842pt" viewBox="0 0 595 842" version="1.1"> 
<defs> 
<g> 
<symbol overflow="visible" id="glyph0-0"> 
<path style="stroke:none;" d=""/> 
</symbol> 
<symbol overflow="visible" id="glyph0-1"> 
<path style="stroke:none;" d=""/> 
</symbol> 

我与最短的比赛,如比赛=“SVG/DEFS/G /记号”甚至试图,甚至匹配=“符号”,它仍然不不要修改svg文件。

有没有办法使用XML工具(或bash脚本,如果更简单)删除所有“glyph0- *”符号?

回答

1

我想删除其中id为 “glyph0”

对于此启动所有的 “符号” 的节点,你需要改变:

<xsl:template match="svg/defs/g/symbol[id='glyph0-0']"/> 

到:

<xsl:template match="svg:symbol[starts-with(@id,'glyph0-')]" xmlns:svg="http://www.w3.org/2000/svg"/> 
+0

这是令人印象深刻的,并解决了一个问题,我试图解决几个小时。如果我有很多节点要处理,是不是有办法摆脱样板? –

+0

@userunknown不确定你的意思是“样板”。 –

+0

那么,“svg:符号”,而不是“符号”和“xmlns:svg ...” - 部分。不能在文件范围内指定一次吗?对不起,我不深入xml/xslt主题。可能是一个非常愚蠢的问题。 –