xsl-list
[Top] [All Lists]

RE: [xsl] generate an element only if the result is not empty

2009-08-25 05:57:25
The whitespace in your output is a copy of the inter-element whitespace from
your input, so your simplest solution is to remove it from the input using

<xsl:strip-space elements="seg"/>

The alternative would be to do something like

<xsl:apply-templates select="text()[normalize-space()]"/>

Regards,

Michael Kay
http://www.saxonica.com/
http://twitter.com/michaelhkay  

-----Original Message-----
From: Manuel Souto Pico [mailto:manuel(_dot_)souto(_at_)star-group(_dot_)net] 
Sent: 25 August 2009 10:11
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] generate an element only if the result is not empty

Hello!

Again I have a doubt with generating empty elements. Here by 
empty I mean that the element only contains whitespace 
(\s|\t|\r|\n). I hope you can provide some help.

I use this spreadsheet
view-source:http://xtek-solutions.net/burgundyridge/Viz/XML_TM
/XLF_XLIFF_schemas/TMXtoTBX.xsl 


to turn omething like this
   
    <tu>
        <tuv xml:lang="es-es" changedate="20090824T155642Z" 
changeid="Transit">
            <seg>
                <it>&lt;/Title&gt;</it>
                <bpt i="1" type="struct">&lt;Elt type='Groupbox' 
id='242' coor='0,0,412,112' style='50020007,0' 
class='#FF#0080'&gt;</bpt>
            </seg>
        </tuv>
    </tu>

into

    <termEntry>
        <langSet xml:lang="es-es">
            <ntig>
                <termGrp>
                    <term>
                   
                    </term>
                </termGrp>
            </ntig>
        </langSet>
    </termEntry>

The template (using select="node()" and not select=".")

    <xsl:template match="seg">
        <term>
            <xsl:value-of select="node()" />
        </term>
    </xsl:template>
</xsl:stylesheet>

is well suited for the data that I have, as the output <term> element 
will only have content when the source element <seg> has text 
only (e.g. 
<seg>text</seg>), which is what I want, that is, I wouldn't want a 
<term> element with the content of the <seg> element you can 
see above 
(<it>, <bpt>, etc.). However a drawback of it is that empty 
elements are 
generated. In the example I provide above I would like to avoid 
generating the whole <termEntry> element if the <term> is 
only going to 
contain whitespace.

I've tried using strip-space, but that affects the source, not the 
output. I've also found a template called copy-unless-empty 
(http://www.dpawson.co.uk/xsl/sect2/N3328.html#d4887e64), 
which is what 
I need, I guess, but I don't know how to use it (I've tried but...).

If you could understand what I need ;) and you know how to 
help, could 
you drop a line?

I'm using Saxon6.5.5 with XPath 1.0 in <oXygen/> XML editor.

Thank you so much in advance for your help!

Cheers, Manuel

The whole sample files:

___SOURCE DATA___

<?xml version="1.0" encoding="UTF-8" ?>               
<!DOCTYPE tmx SYSTEM "tmx14.dtd">    
<!-- Transit TMX document -->
<tmx version="1.4">
    <header creationtool="Transit NXT" creationtoolversion="4.0" 
datatype="Transit" segtype="block" adminlang="en" srclang="en-us" 
o-tmf="Transit" creationdate="20090824T155634Z" creationid="MS9" 
o-encoding="Unicode">
        <prop type="Project" />
    </header>
    <body>
        <tu>
            <prop 
type="FileFormatGUID">{1F8A6315-CDF7-4164-BE09-C4821791D320}</prop>
            <prop type="Filename">DicAdmin_ENG</prop>
            <tuv xml:lang="en-us" changedate="20090812T170437Z" 
changeid="Transit">
                <seg>Data record structure</seg>
            </tuv>
            <tuv xml:lang="es-es" changedate="20090505T095118Z" 
changeid="CV2" creationdate="20090416T102716Z" creationid="MS9">
                <seg>Estructura del registro de datos</seg>
            </tuv>
        </tu>
        <tu>
            <prop 
type="FileFormatGUID">{1F8A6315-CDF7-4164-BE09-C4821791D320}</prop>
            <prop type="Filename">DicAdmin_ENG</prop>
            <tuv xml:lang="en-us" changedate="20090824T155641Z" 
changeid="Transit">
                <seg>
                    <it>&lt;/Title&gt;</it>
                    <bpt i="1" type="struct">&lt;Elt type='Groupbox' 
id='242' coor='0,0,412,112' style='50020007,0' 
class='#FF#0080'&gt;</bpt>
                </seg>
            </tuv>
            <tuv xml:lang="es-es" changedate="20090824T155642Z" 
changeid="Transit">
                <seg>
                    <it>&lt;/Title&gt;</it>
                    <bpt i="1" type="struct">&lt;Elt type='Groupbox' 
id='242' coor='0,0,412,112' style='50020007,0' 
class='#FF#0080'&gt;</bpt>
                </seg>
            </tuv>
        </tu>
    </body>
</tmx>


___OUTPUT___

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE martif
  PUBLIC "ISO 12200:1999A//DTD MARTIF core (DXFcdV04)//EN" 
"TBXcdv04.dtd">
<martif xml:lang="" type="TBX">
   <martifHeader>
      <fileDesc>
         <sourceDesc>
            <p>Generated with TMX2TBX4TermStarNXT_noDupl.xsl</p>
         </sourceDesc>
      </fileDesc>
      <encodingDesc>
         <p type="DCSName"/>
      </encodingDesc>
   </martifHeader>
   <text>
      <body>
   
       
   
   
       
         <termEntry id="">
            <langSet xml:lang="en-us">
               <ntig>
                  <termGrp>
                     <term>Data record structure</term>
                  </termGrp>
               </ntig>
            </langSet>
            <langSet xml:lang="es-es">
               <ntig>
                  <termGrp>
                     <term>Estructura del registro de datos</term>
                  </termGrp>
               </ntig>
            </langSet>
         </termEntry>
       
         <termEntry id="">
            <langSet xml:lang="en-us">
               <ntig>
                  <termGrp>
                     <term>
                   
                     </term>
                  </termGrp>
               </ntig>
            </langSet>
            <langSet xml:lang="es-es">
               <ntig>
                  <termGrp>
                     <term>
                   
                     </term>
                  </termGrp>
               </ntig>
            </langSet>
         </termEntry>
   

      </body>
   </text>
</martif>


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--