Avatar billede shemeri Praktikant
27. august 2005 - 07:40 Der er 11 kommentarer og
1 løsning

fjern <g>

Hej,
Er der nogen der ved hvordan jeg kan fjerne tom <g> elementer fra en SVG fil? Altså, hvis <g> ikke har attributer så er den tom og skal fjernes.

Problemet er hvis der er "nested" <g> elementer :(
Avatar billede softspot Forsker
27. august 2005 - 12:59 #1
Det her er en rå udgave, som givetvis skal tilpasses med diverse snørklede hjørner af xml-formatet (f.eks. namespaces osv), men det kan da give et hint til hvordan det kan gøes...


<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

<xsl:template match="*">
    <xsl:if test="(name() = 'g' and count(*) &gt; 0) or (name() != 'g')">
    <xsl:text disable-output-escaping="no">&lt;</xsl:text>
    <xsl:value-of select="name()" />
    <xsl:for-each select="@*">
        <xsl:text> </xsl:text>
        <xsl:value-of select="name()" />
        <xsl:text>="</xsl:text>
        <xsl:value-of select="." />
        <xsl:text>"</xsl:text>
    </xsl:for-each>
    <xsl:text disable-output-escaping="no">&gt;</xsl:text>
    <xsl:apply-templates />
    <xsl:text disable-output-escaping="no">&lt;/</xsl:text>
    <xsl:value-of select="name()" />
    <xsl:text disable-output-escaping="no">&gt;</xsl:text>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>
Avatar billede shemeri Praktikant
27. august 2005 - 19:38 #2
jeg har følgene men den virker ikke med "nested" <g>'er

<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output method="xml" omit-xml-declaration="no" indent="no" />

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

<xsl:template match="*[local-name() = 'g']">
<xsl:if test="count(@*) &gt; 0">
  <xsl:element name="{local-name()}" namespace="{namespace-uri()}">
  <xsl:copy-of select="@*"/>
  </xsl:element>
</xsl:if>
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="*|@*|text()|comment()">
  <xsl:copy>
    <xsl:apply-templates select="*|@*"/>
  </xsl:copy>
</xsl:template>
Avatar billede softspot Forsker
27. august 2005 - 20:20 #3
Er problemet at den fjerne g-elementer der er "tomme", selvom de har childnodes, hvor det var meningen at den kun skulle fjerne helt tomme g-elementer, altså hvis de hverken havde childnodes, tekst eller attributter?
Avatar billede softspot Forsker
27. august 2005 - 20:24 #4
Hmmm... hvad så med denne udgave:

<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" omit-xml-declaration="no" indent="no" />

<xsl:template match="/">
    <html>
        <body>
            <textarea style="width:500px;height:400px">
                <xsl:apply-templates/>
            </textarea>
        </body>
    </html>
</xsl:template>

<xsl:template match="*[local-name() = 'g' and count(*) = 0 and (text() = '' or not(text()))]">
    <xsl:if test="count(@*) &gt; 0">
        <xsl:element name="{local-name()}" namespace="{namespace-uri()}">
            <xsl:copy-of select="@*" />
        </xsl:element>
    </xsl:if>
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="*|@*|text()|comment()">
    <xsl:copy>
        <xsl:apply-templates select="*|@*"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
Avatar billede softspot Forsker
27. august 2005 - 20:25 #5
Du fjerner lige selv den html jeg har sat ind, ikk'? :)
Avatar billede softspot Forsker
27. august 2005 - 20:26 #6
Jeg bemærker dog at den ikke udskriver tekst-indholdet af noder (altså det der stå mellem tags). Er det meningen?
Avatar billede shemeri Praktikant
27. august 2005 - 23:55 #7
XSLT slak fjerne alle g-elementer der er "tomme", men childnodes skal ikke fjernes. Altså hvis en g-element har attributter så er den ikke "tom"!

Eksample;
<?xml version="1.0" encoding="utf-8"?>
<svg>

<rect x="3.167" y="88.546" width="166.667" height="122.667"/>
<rect x="0.5" y="243.212" width="166.667" height="122.667"/>

<g id="XMLID_1_">
  <g id="32">
    <rect x="93.833" y="144.546" width="212" height="168"/>
  </g>
  <g>
    <rect x="93.833" y="144.546" fill="none" stroke="#000000" width="212" height="168"/>
  </g>
</g>
<g>
<g id="938">
  <path fill="none" d="M101.833,437.879c40 126.667-109.334"/>
  <path fill="none" d="M101.833,437.879c40 126.667-109.334"/>
</g>
</g>
<g>
<g>
  <path fill="none" d="M101.833,437.879c40 126.667-109.334"/>
  <path fill="none" d="M101.833,437.879c40 126.667-109.334"/>
  <path fill="none" d="M101.833,437.879c40 126.667-109.334"/>
  </g>
</g>
<g>
<g>
  <g id="232">
  <path fill="none" d="M101.833,437.879c40 126.667-109.334"/>
  <path fill="none" d="M101.833,437.879c40 126.667-109.334"/>
  <path fill="none" d="M101.833,437.879c40 126.667-109.334"/>
  </g>
</g>
</g>
</svg>

--------------------------------
XSLT resultat skal se sadan ud;
--------------------------------
<?xml version="1.0" encoding="utf-8"?>
<svg>

<rect x="3.167" y="88.546" width="166.667" height="122.667"/>
<rect x="0.5" y="243.212" width="166.667" height="122.667"/>

<g id="XMLID_1_">
  <g id="32">
    <rect x="93.833" y="144.546" width="212" height="168"/>
  </g>
    <rect x="93.833" y="144.546" fill="none" stroke="#000000" width="212" height="168"/>
</g>
<g id="938">
  <path fill="none" d="M101.833,437.879c40 126.667-109.334"/>
  <path fill="none" d="M101.833,437.879c40 126.667-109.334"/>
</g>
  <path fill="none" d="M101.833,437.879c40 126.667-109.334"/>
  <path fill="none" d="M101.833,437.879c40 126.667-109.334"/>
  <path fill="none" d="M101.833,437.879c40 126.667-109.334"/>
  <g id="232">
  <path fill="none" d="M101.833,437.879c40 126.667-109.334"/>
  <path fill="none" d="M101.833,437.879c40 126.667-109.334"/>
  <path fill="none" d="M101.833,437.879c40 126.667-109.334"/>
  </g>
</svg>


hvor aller g-elementer er fjernet!
Avatar billede softspot Forsker
28. august 2005 - 00:16 #8
Hvad så med denne her kode - den resulterer i det mindste i det du skriver du gerne vil have i dit post fra 27/08-2005 23:55:22...


<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" omit-xml-declaration="no" indent="no" />

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

<xsl:template match="*[local-name() = 'g']">
    <xsl:choose>
        <xsl:when test="count(@*) &gt; 0">
            <xsl:element name="{local-name()}" namespace="{namespace-uri()}">
                <!-- xsl-copy-of select="@*" / -->
                <xsl:apply-templates select="*|@*"/>
            </xsl:element>
        </xsl:when>
        <xsl:otherwise>
            <xsl:apply-templates />
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template match="*|@*|text()|comment()">
    <xsl:copy>
        <xsl:apply-templates select="*|@*"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
Avatar billede shemeri Praktikant
28. august 2005 - 01:25 #9
jeg lige prøvet og det virker med "nested" g-elementer, tror jeg, efter min test :-)

Skal jeg have følgene skrevet på denne måde
<xsl:element name="{local-name()}" namespace="{namespace-uri()}">
eller kan jeg gøre det uden namespace;
<xsl:element name="{local-name()}">

da jeg får følgene resultat med g-elementer;
<g xmlns="http://www.w3.org/2000/svg" id="232">

tak
husk at svar :-)
Avatar billede softspot Forsker
28. august 2005 - 01:41 #10
Jeg kender ikke SVG-formatet og er derfor ikke klar over om den kræver at der er namespaces på g-elementer, så jeg kan umiddelbart give dig et svar på det sidste spørgsmål. Det er nok et spørgsmål om at prøve om det virker uden (eller spørge nogen som ved noget om SVG-formatet :))...

Velbekomme :)
Avatar billede softspot Forsker
28. august 2005 - 01:50 #11
Tak for point :)
Avatar billede shemeri Praktikant
28. august 2005 - 01:51 #12
velbekomme :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester