2016-05-17 7 views
2

Ich benötige ein Bash-Skript, das eine PDF-Datei verarbeiten und bearbeiten würde.Entfernen Sie Elemente von SVG durch ID, mit XSL

Ich habe erfolgreich die PDF-Datei in SVG konvertiert, und versuche jetzt, Sachen, die ich nicht brauche, von diesem SVG zu entfernen. Hier

ist eine Probe der Datei, die ich bearbeiten möchten:

<?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> 

Ich möchte alle „Symbol“ Knoten löschen, wo id mit „glyph0“ beginnt, was bedeutet, dass ich die folgende Ausgabe:

<?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> 

I haben versucht, die folgenden XSL-Datei verwenden, die glyph0-0 Eingang (zunächst) zu entfernen:

<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> 

Wenn ich diesen Filter mit xsltproc anwende, tut das nichts. Es sollte glyph0-0 entfernen:

$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> 

Ich habe versucht, auch bei kürzesten Matches, wie match = "svg/defs/g/Symbol" oder sogar übereinstimmen = "Symbol", und es immer noch tut Ändern Sie nicht die Svg-Datei.

Gibt es eine Möglichkeit, alle "glyph0- *" Symbole zu entfernen, mit einem XML-Tool (oder einem Bash-Skript, wenn das einfacher ist)?

Antwort

1

Ich möchte alle "Symbol" Knoten löschen, wo id beginnt mit "glyph0"

Dazu müssen Sie ändern:

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

zu:

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

Das ist beeindruckend und löst ein Problem, ich habe versucht, für Stunden zu lösen. Wenn ich viele Knoten habe, gibt es keine Möglichkeit, das Boilerplate loszuwerden? –

+0

@userunknown Nicht sicher, was Sie mit "Boilerplate" meinen. –

+0

Nun, das "svg: symbol" statt nur "symbol" und der "xmlns: svg ..." - Teil. Kann dies nicht fileweit einmal angegeben werden? Es tut mir leid, ich bin nicht tief im xml/xslt-Thema. Wahrscheinlich eine sehr dumme Frage. –

Verwandte Themen