Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>You can use a <em>composite key</em> to collect the cars by brand, type and color:</p> <pre><code>&lt;xsl:output indent="yes"/&gt; &lt;xsl:key name="k_cars" match="/products/cars/car/attribs/attrib" use="concat(../../brand,../../type,color)"/&gt; </code></pre> <p>Then iterate on <code>cars/car</code> and, because you need to check the price for all colors (some car may miss a color), sub-iterate on <code>colors/color</code> and use <code>xsl:choose</code> testing on the key. If the key returns a node, then print corresponding price; otherwise print <code>-</code>:</p> <pre><code>&lt;xsl:variable name="car" select="."/&gt; &lt;xsl:for-each select="/products/colors/*"&gt; &lt;xsl:variable name="v_CarColor" select="key('k_cars',concat($car/brand,$car/type,id))"/&gt; &lt;xsl:choose&gt; &lt;xsl:when test="$v_CarColor"&gt; &lt;ss:Cell&gt; &lt;ss:Data ss:Type="String"&gt; &lt;xsl:value-of select="$v_CarColor/price"/&gt; &lt;/ss:Data&gt; &lt;/ss:Cell&gt; &lt;/xsl:when&gt; &lt;xsl:otherwise&gt; &lt;ss:Cell&gt; &lt;ss:Data ss:Type="String"&gt;-&lt;/ss:Data&gt; &lt;/ss:Cell&gt; &lt;/xsl:otherwise&gt; &lt;/xsl:choose&gt; &lt;/xsl:for-each&gt; </code></pre> <hr> <p>Your final transform:</p> <pre><code>&lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ss="excel.xml"&gt; &lt;xsl:output indent="yes"/&gt; &lt;xsl:key name="k_cars" match="/products/cars/car/attribs/attrib" use="concat(../../brand,../../type,color)"/&gt; &lt;xsl:template match="/products"&gt; &lt;ss:Table&gt; &lt;ss:Row&gt; &lt;!-- This is the header row --&gt; &lt;ss:Cell&gt; &lt;ss:Data ss:Type="String"&gt;Brand / Model&lt;/ss:Data&gt; &lt;/ss:Cell&gt; &lt;xsl:for-each select="colors/color"&gt; &lt;ss:Cell&gt; &lt;ss:Data ss:Type="String"&gt; &lt;xsl:value-of select="id"/&gt;/&lt;xsl:value-of select="shortdesc"/&gt; &lt;/ss:Data&gt; &lt;/ss:Cell&gt; &lt;/xsl:for-each&gt; &lt;/ss:Row&gt; &lt;xsl:for-each select="cars/car"&gt; &lt;ss:Row&gt; &lt;ss:Cell&gt; &lt;ss:Data ss:Type="String"&gt; &lt;xsl:value-of select="brand"/&gt; &lt;xsl:value-of select="type"/&gt; &lt;/ss:Data&gt; &lt;/ss:Cell&gt; &lt;xsl:variable name="car" select="."/&gt; &lt;xsl:for-each select="/products/colors/*"&gt; &lt;xsl:variable name="v_CarColor" select="key('k_cars',concat($car/brand,$car/type,id))"/&gt; &lt;xsl:choose&gt; &lt;xsl:when test="$v_CarColor"&gt; &lt;ss:Cell&gt; &lt;ss:Data ss:Type="String"&gt; &lt;xsl:value-of select="$v_CarColor/price"/&gt; &lt;/ss:Data&gt; &lt;/ss:Cell&gt; &lt;/xsl:when&gt; &lt;xsl:otherwise&gt; &lt;ss:Cell&gt; &lt;ss:Data ss:Type="String"&gt;-&lt;/ss:Data&gt; &lt;/ss:Cell&gt; &lt;/xsl:otherwise&gt; &lt;/xsl:choose&gt; &lt;/xsl:for-each&gt; &lt;/ss:Row&gt; &lt;/xsl:for-each&gt; &lt;/ss:Table&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt; </code></pre>
    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. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      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