Note that there are some explanatory texts on larger screens.

plurals
  1. POAdding up numbers depending on textual entries in XML using XSL
    primarykey
    data
    text
    <p>I have a XML like this:</p> <pre><code>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt; &lt;variablelist&gt; &lt;varinfo id="id-5"&gt; &lt;vardef&gt; &lt;name&gt;A&lt;/name&gt; &lt;init&gt; &lt;compoundinit type="composite"&gt; &lt;singleinit&gt;(unsigned char)6&lt;/singleinit&gt; &lt;singleinit&gt;(unsigned char)0&lt;/singleinit&gt; &lt;compoundinit type="array"&gt; &lt;singleinit&gt;(short)400&lt;/singleinit&gt; &lt;singleinit&gt;(short)600&lt;/singleinit&gt; &lt;singleinit&gt;(short)800&lt;/singleinit&gt; &lt;/compoundinit&gt; &lt;compoundinit type="array"&gt; &lt;singleinit&gt;(short)32767&lt;/singleinit&gt; &lt;singleinit&gt;(short)32767&lt;/singleinit&gt; &lt;singleinit&gt;(short)32767&lt;/singleinit&gt; &lt;/compoundinit&gt; &lt;/compoundinit&gt; &lt;/init&gt; &lt;/vardef&gt; &lt;/varinfo&gt; &lt;varinfo id="id-10"&gt; &lt;vardef&gt; &lt;name&gt;B&lt;/name&gt; &lt;init&gt; &lt;compoundinit type="array"&gt; &lt;singleinit&gt;(uint32 const volatile)0U&lt;/singleinit&gt; &lt;singleinit&gt;(uint32 const volatile)0U&lt;/singleinit&gt; &lt;singleinit&gt;(uint32 const volatile)0U&lt;/singleinit&gt; &lt;singleinit&gt;(uint32 const volatile)0U&lt;/singleinit&gt; &lt;/compoundinit&gt; &lt;/init&gt; &lt;/vardef&gt; &lt;/varinfo&gt; &lt;varinfo id="id-200"&gt; &lt;vardef&gt; &lt;name&gt;C&lt;/name&gt; &lt;init&gt; &lt;compoundinit type="composite"&gt; &lt;singleinit&gt;(unsigned char)12&lt;/singleinit&gt; &lt;singleinit&gt;(unsigned char)12&lt;/singleinit&gt; &lt;compoundinit type="array"&gt; &lt;singleinit&gt;(short)900&lt;/singleinit&gt; &lt;singleinit&gt;(short)1000&lt;/singleinit&gt; &lt;singleinit&gt;(short)1240&lt;/singleinit&gt; &lt;singleinit&gt;(short)1750&lt;/singleinit&gt; &lt;/compoundinit&gt; &lt;compoundinit type="array"&gt; &lt;singleinit&gt;(short)512&lt;/singleinit&gt; &lt;singleinit&gt;(short)640&lt;/singleinit&gt; &lt;singleinit&gt;(short)853&lt;/singleinit&gt; &lt;singleinit&gt;(short)1067&lt;/singleinit&gt; &lt;singleinit&gt;(short)1280&lt;/singleinit&gt; &lt;/compoundinit&gt; &lt;compoundinit type="array"&gt; &lt;compoundinit type="array"&gt; &lt;singleinit&gt;(unsigned char)153&lt;/singleinit&gt; &lt;singleinit&gt;(unsigned char)153&lt;/singleinit&gt; &lt;singleinit&gt;(unsigned char)153&lt;/singleinit&gt; &lt;singleinit&gt;(unsigned char)153&lt;/singleinit&gt; &lt;/compoundinit&gt; &lt;compoundinit type="array"&gt; &lt;singleinit&gt;(unsigned char)153&lt;/singleinit&gt; &lt;singleinit&gt;(unsigned char)153&lt;/singleinit&gt; &lt;singleinit&gt;(unsigned char)153&lt;/singleinit&gt; &lt;singleinit&gt;(unsigned char)153&lt;/singleinit&gt; &lt;/compoundinit&gt; &lt;/compoundinit&gt; &lt;/compoundinit&gt; &lt;/init&gt; &lt;/vardef&gt; &lt;/varinfo&gt; &lt;/variablelist&gt; </code></pre> <p>What I want to do is to add up used bits of the variables. So variable A for example consists of 2 "unsigned char" and 6 "short" datatypes. Lets assume "short" equals 16 bit and "char" 8 bit. Thus variable A has 112 bit (6*16 + 2*8).</p> <p>How would a XSLT file look like if I wanted the following output:</p> <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;variablelist&gt; &lt;varinfo&gt; &lt;name&gt;A&lt;/name&gt; &lt;size&gt;112&lt;/size&gt; &lt;/varinfo&gt; &lt;varinfo&gt; &lt;name&gt;B&lt;/name&gt; &lt;size&gt;128&lt;/size&gt; &lt;/varinfo&gt; &lt;varinfo&gt; &lt;name&gt;C&lt;/name&gt; &lt;size&gt;224&lt;/size&gt; &lt;/varinfo&gt; &lt;/variablelist&gt; </code></pre> <p>At the moment I at least managed to achieve the following output:</p> <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;variablelist&gt; &lt;varinfo&gt; &lt;name&gt;A&lt;/name&gt; &lt;size&gt;(unsigned char)6(unsigned char)0(short)400(short)600(short)800(short)32767(short)32767(short)32767&lt;/size&gt; &lt;/varinfo&gt; &lt;varinfo&gt; &lt;name&gt;B&lt;/name&gt; &lt;size&gt;(uint32 const volatile)0U(uint32 const volatile)0U(uint32 const volatile)0U(uint32 const volatile)0U&lt;/size&gt; &lt;/varinfo&gt; &lt;varinfo&gt; &lt;name&gt;C&lt;/name&gt; &lt;size&gt;(unsigned char)12(unsigned char)12(short)900(short)1000(short)1240(short)1750(short)512(short)640(short)853(short)1067(short)1280(unsigned char)153(unsigned char)153(unsigned char)153(unsigned char)153(unsigned char)153(unsigned char)153(unsigned char)153(unsigned char)153&lt;/size&gt; &lt;/varinfo&gt; &lt;/variablelist&gt; </code></pre> <p>With this transform code:</p> <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:output method="xml" indent="yes" /&gt; &lt;xsl:template match="/"&gt; &lt;variablelist&gt; &lt;xsl:apply-templates select="/variablelist"/&gt; &lt;/variablelist&gt; &lt;/xsl:template&gt; &lt;xsl:template match="variablelist"&gt; &lt;xsl:for-each select="varinfo"&gt; &lt;varinfo&gt; &lt;xsl:choose&gt; &lt;xsl:when test="not(current()/vardef/init)"&gt; &lt;!-- ... --&gt; &lt;/xsl:when&gt; &lt;xsl:when test="current()/vardef/init"&gt; &lt;xsl:choose&gt; &lt;xsl:when test="current()/vardef/init/singleinit"&gt; &lt;!-- ... --&gt; &lt;/xsl:when&gt; &lt;xsl:otherwise&gt; &lt;name&gt; &lt;xsl:value-of select="current()/vardef/name/."/&gt; &lt;/name&gt; &lt;size&gt; &lt;xsl:for-each select="current()/vardef/init//node()"&gt; &lt;xsl:if test="name() = 'singleinit'"&gt; &lt;xsl:value-of select="."/&gt; &lt;/xsl:if&gt; &lt;/xsl:for-each&gt; &lt;/size&gt; &lt;/xsl:otherwise&gt; &lt;/xsl:choose&gt; &lt;/xsl:when&gt; &lt;xsl:otherwise&gt; &lt;!-- ... --&gt; &lt;/xsl:otherwise&gt; &lt;/xsl:choose&gt; &lt;/varinfo&gt; &lt;/xsl:for-each&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt; </code></pre> <p>For transformation of the strings to my numbers I would use something like this:</p> <pre><code>&lt;xsl:when test="contains((substring-before((current()/vardef/init/singleinit/.),')')),'char')"&gt; &lt;xsl:value-of select="'8'"/&gt; &lt;/xsl:when&gt; </code></pre> <p>Has anybody got an idea of how to solve my problem? I tried different ways via variables or parameters, but I was not successful so far.</p> <p>Thanks!</p> <p>PS.: First question asked here, hope I followed your netiquette correctly. And has somebody an idea of a better title?</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload