title: XML/XSLT - Can't count unique child nodes
body: <p>I need to transform my XML file with XSL code in order to import the content into InDesign. Unfortunately, I'm having problems with counting child nodes of one of the groups.</p>
  
  <p>Here is the XML code:</p>
  
  <pre><code>&lt;?xml version="1.0"?&gt;
  &lt;records&gt;
     &lt;list&gt;
        &lt;!-- SPECIAL NOTE --&gt;
        &lt;specialNote&gt;
           &lt;specialNoteTitle&gt;Title&lt;/specialNoteTitle&gt;
           &lt;specialNoteContent&gt;Special note content&lt;/specialNoteContent&gt;
        &lt;/specialNote&gt;
        &lt;!-- TITLE &amp; ADDRESS --&gt;
        &lt;address&gt;
           &lt;listTitle&gt;December&lt;/listTitle&gt;
           &lt;addressLines&gt;
              &lt;line1&gt;1&lt;/line1&gt;
              &lt;line2&gt;2&lt;/line2&gt;
              &lt;line3&gt;3&lt;/line3&gt;
              &lt;line4&gt;4&lt;/line4&gt;
           &lt;/addressLines&gt;
        &lt;/address&gt;
        &lt;!-- PRODUCTS --&gt;
        &lt;products&gt;
           &lt;productNr1&gt;
              &lt;productCode&gt;Jeden&lt;/productCode&gt;
              &lt;productName&gt;1&lt;/productName&gt;
              &lt;productBrand&gt;1&lt;/productBrand&gt;
              &lt;productNK&gt;1&lt;/productNK&gt;
           &lt;/productNr1&gt;
           &lt;productNr2&gt;
              &lt;productCode&gt;1&lt;/productCode&gt;
              &lt;productName&gt;1&lt;/productName&gt;
              &lt;productBrand&gt;1&lt;/productBrand&gt;
              &lt;productNK&gt;1&lt;/productNK&gt;
           &lt;/productNr2&gt;
           &lt;productNr3&gt;
              &lt;productCode&gt;1&lt;/productCode&gt;
              &lt;productName&gt;1&lt;/productName&gt;
              &lt;productBrand&gt;1&lt;/productBrand&gt;
              &lt;productNK&gt;1&lt;/productNK&gt;
           &lt;/productNr3&gt;
           &lt;productNr4&gt;
              &lt;productCode&gt;1&lt;/productCode&gt;
              &lt;productName&gt;1&lt;/productName&gt;
              &lt;productBrand&gt;1&lt;/productBrand&gt;
              &lt;productNK&gt;1&lt;/productNK&gt;
           &lt;/productNr4&gt;
           &lt;productNr5&gt;
              &lt;productCode&gt;1&lt;/productCode&gt;
              &lt;productName&gt;1&lt;/productName&gt;
              &lt;productBrand&gt;1&lt;/productBrand&gt;
              &lt;productNK&gt;1&lt;/productNK&gt;
           &lt;/productNr5&gt;
           &lt;productNr6&gt;
              &lt;productCode&gt;1&lt;/productCode&gt;
              &lt;productName&gt;1&lt;/productName&gt;
              &lt;productBrand&gt;1&lt;/productBrand&gt;
              &lt;productNK&gt;1&lt;/productNK&gt;
           &lt;/productNr6&gt;
           &lt;productNr7&gt;
              &lt;productCode&gt;1&lt;/productCode&gt;
              &lt;productName&gt;1&lt;/productName&gt;
              &lt;productBrand&gt;1&lt;/productBrand&gt;
              &lt;productNK&gt;1&lt;/productNK&gt;
           &lt;/productNr7&gt;
           &lt;productNr8&gt;
              &lt;productCode&gt;1&lt;/productCode&gt;
              &lt;productName&gt;1&lt;/productName&gt;
              &lt;productBrand&gt;1&lt;/productBrand&gt;
              &lt;productNK&gt;1&lt;/productNK&gt;
           &lt;/productNr8&gt;
        &lt;/products&gt;
        &lt;!-- CODES --&gt;
        &lt;promoCodes&gt;
           &lt;promoCode1&gt;
              &lt;promoCode&gt;22&lt;/promoCode&gt;
              &lt;instruction&gt;22&lt;/instruction&gt;
           &lt;/promoCode1&gt;
           &lt;promoCode2&gt;
              &lt;promoCode&gt;21&lt;/promoCode&gt;
              &lt;instruction&gt;23&lt;/instruction&gt;
           &lt;/promoCode2&gt;
           &lt;promoCode3&gt;
              &lt;promoCode&gt;12&lt;/promoCode&gt;
              &lt;instruction&gt;12&lt;/instruction&gt;
           &lt;/promoCode3&gt;
           &lt;promoCode4&gt;
              &lt;promoCode&gt;22&lt;/promoCode&gt;
              &lt;instruction&gt;11&lt;/instruction&gt;
           &lt;/promoCode4&gt;
        &lt;/promoCodes&gt;
     &lt;/list&gt;
     &lt;list&gt;
        &lt;!-- SPECIAL NOTE --&gt;
        &lt;specialNote&gt;
           &lt;specialNoteTitle&gt;Title&lt;/specialNoteTitle&gt;
           &lt;specialNoteContent&gt;Special note content&lt;/specialNoteContent&gt;
        &lt;/specialNote&gt;
        &lt;!-- TITLE &amp; ADDRESS --&gt;
        &lt;address&gt;
           &lt;listTitle&gt;December&lt;/listTitle&gt;
           &lt;addressLines&gt;
              &lt;line1&gt;1&lt;/line1&gt;
              &lt;line2&gt;2&lt;/line2&gt;
              &lt;line3&gt;3&lt;/line3&gt;
              &lt;line4&gt;4&lt;/line4&gt;
           &lt;/addressLines&gt;
        &lt;/address&gt;
        &lt;!-- PRODUCTS --&gt;
        &lt;products&gt;
           &lt;productNr1&gt;
              &lt;productCode&gt;Jeden&lt;/productCode&gt;
              &lt;productName&gt;1&lt;/productName&gt;
              &lt;productBrand&gt;1&lt;/productBrand&gt;
              &lt;productNK&gt;1&lt;/productNK&gt;
           &lt;/productNr1&gt;
           &lt;productNr2&gt;
              &lt;productCode&gt;1&lt;/productCode&gt;
              &lt;productName&gt;1&lt;/productName&gt;
              &lt;productBrand&gt;1&lt;/productBrand&gt;
              &lt;productNK&gt;1&lt;/productNK&gt;
           &lt;/productNr2&gt;
           &lt;productNr3&gt;
              &lt;productCode&gt;1&lt;/productCode&gt;
              &lt;productName&gt;1&lt;/productName&gt;
              &lt;productBrand&gt;1&lt;/productBrand&gt;
              &lt;productNK&gt;1&lt;/productNK&gt;
           &lt;/productNr3&gt;
           &lt;productNr4&gt;
              &lt;productCode&gt;1&lt;/productCode&gt;
              &lt;productName&gt;1&lt;/productName&gt;
              &lt;productBrand&gt;1&lt;/productBrand&gt;
              &lt;productNK&gt;1&lt;/productNK&gt;
           &lt;/productNr4&gt;
           &lt;productNr5&gt;
              &lt;productCode&gt;1&lt;/productCode&gt;
              &lt;productName&gt;1&lt;/productName&gt;
              &lt;productBrand&gt;1&lt;/productBrand&gt;
              &lt;productNK&gt;1&lt;/productNK&gt;
           &lt;/productNr5&gt;
           &lt;productNr6&gt;
              &lt;productCode&gt;1&lt;/productCode&gt;
              &lt;productName&gt;1&lt;/productName&gt;
              &lt;productBrand&gt;1&lt;/productBrand&gt;
              &lt;productNK&gt;1&lt;/productNK&gt;
           &lt;/productNr6&gt;
           &lt;productNr7&gt;
              &lt;productCode&gt;1&lt;/productCode&gt;
              &lt;productName&gt;1&lt;/productName&gt;
              &lt;productBrand&gt;1&lt;/productBrand&gt;
              &lt;productNK&gt;1&lt;/productNK&gt;
           &lt;/productNr7&gt;
           &lt;productNr8&gt;
              &lt;productCode&gt;1&lt;/productCode&gt;
              &lt;productName&gt;1&lt;/productName&gt;
              &lt;productBrand&gt;1&lt;/productBrand&gt;
              &lt;productNK&gt;1&lt;/productNK&gt;
           &lt;/productNr8&gt;
        &lt;/products&gt;
        &lt;!-- CODES --&gt;
        &lt;promoCodes&gt;
           &lt;promoCode1&gt;
              &lt;promoCode&gt;22&lt;/promoCode&gt;
              &lt;instruction&gt;22&lt;/instruction&gt;
           &lt;/promoCode1&gt;
           &lt;promoCode2&gt;
              &lt;promoCode&gt;21&lt;/promoCode&gt;
              &lt;instruction&gt;23&lt;/instruction&gt;
           &lt;/promoCode2&gt;
           &lt;promoCode3&gt;
              &lt;promoCode&gt;12&lt;/promoCode&gt;
              &lt;instruction&gt;12&lt;/instruction&gt;
           &lt;/promoCode3&gt;
           &lt;promoCode4&gt;
              &lt;promoCode&gt;22&lt;/promoCode&gt;
              &lt;instruction&gt;11&lt;/instruction&gt;
           &lt;/promoCode4&gt;
        &lt;/promoCodes&gt;
     &lt;/list&gt;
  &lt;/records&gt;
  </code></pre>
  
  <p>And my XSL code:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  &lt;xsl:stylesheet xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
  xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/" xmlns:aid5="http://ns.adobe.com/AdobeInDesign/5.0/" exclude-result-prefixes="xs"&gt;
  
     &lt;!-- MAIN TREE --&gt;
     &lt;xsl:template match="/"&gt;
        &lt;records&gt;
        &lt;xsl:apply-templates/&gt;
        &lt;/records&gt;
     &lt;/xsl:template&gt;
  
     &lt;xsl:template match="list"&gt;
        &lt;list&gt;
        &lt;xsl:apply-templates select="specialNote"/&gt;
          &lt;xsl:apply-templates select="address"/&gt;
          &lt;xsl:apply-templates select="products"/&gt;
          &lt;xsl:apply-templates select="promoCodes"/&gt; 
        &lt;/list&gt;
     &lt;/xsl:template&gt;
  
     &lt;!-- SPECIAL NOTE TEMPLATE --&gt;
     &lt;xsl:template match="specialNote"&gt;
        &lt;break aid:pstyle="break"&gt;
           &lt;xsl:if test="*"&gt;
              &lt;table aid:table="table" aid:trows="2" aid:tcols="1"&gt;
                 &lt;cell aid:table="cell" aid5:cellstyle="special_note_title" aid:crows="1" aid:ccols="1" aid:ccolwidth="362"&gt;&lt;xsl:value-of select="specialNoteTitle" /&gt;&lt;/cell&gt;
                 &lt;cell aid:table="cell" aid5:cellstyle="special_note_content" aid:crows="1" aid:ccols="1" aid:ccolwidth="362"&gt;&lt;xsl:value-of select="specialNoteContent" /&gt;&lt;/cell&gt;
              &lt;/table&gt;
           &lt;/xsl:if&gt;
        &lt;/break&gt;
        &lt;xsl:text&gt;&amp;#xa;&lt;/xsl:text&gt;
     &lt;/xsl:template&gt;
  
     &lt;!-- ADDRESS TEMPLATE --&gt;
     &lt;xsl:template match="address"&gt;
        &lt;table aid:table="table" aid:trows="4" aid:tcols="2"&gt;
           &lt;cell aid:table="cell" aid5:cellstyle="address_title" aid:crows="4" aid:ccols="1" aid:ccolwidth="181"&gt;&lt;xsl:value-of select="listTitle" /&gt;&lt;/cell&gt;
           &lt;xsl:for-each select="addressLines/*"&gt;
              &lt;cell aid:table="cell" aid5:cellstyle="address_line" aid:crows="1" aid:ccols="1" aid:ccolwidth="181"&gt;&lt;xsl:value-of select="." /&gt;&lt;/cell&gt;
           &lt;/xsl:for-each&gt;      
        &lt;/table&gt;
        &lt;xsl:text&gt;&amp;#xa;&lt;/xsl:text&gt;
     &lt;/xsl:template&gt;
  
     &lt;!-- PRODUCTS TEMPLATE --&gt;
     &lt;xsl:template match="products"&gt;
        &lt;xsl:variable name="products_number" select="count(./*)+1" /&gt;
        &lt;table aid:table="table" aid:trows="$products_number" aid:tcols="4"&gt;
           &lt;cell aid:table="cell" aid5:cellstyle="table_head" aid:crows="1" aid:ccols="1" aid:ccolwidth="61"&gt;Code&lt;/cell&gt;
           &lt;cell aid:table="cell" aid5:cellstyle="table_head" aid:crows="1" aid:ccols="1" aid:ccolwidth="120"&gt;Product name&lt;/cell&gt;
           &lt;cell aid:table="cell" aid5:cellstyle="table_head" aid:crows="1" aid:ccols="1" aid:ccolwidth="120"&gt;Product brand&lt;/cell&gt;
           &lt;cell aid:table="cell" aid5:cellstyle="table_head" aid:crows="1" aid:ccols="1" aid:ccolwidth="61"&gt;NK&lt;/cell&gt;
           &lt;xsl:for-each select="*"&gt;
              &lt;cell aid:table="cell" aid5:cellstyle="table_content" aid:crows="1" aid:ccols="1" aid:ccolwidth="61"&gt;&lt;xsl:value-of select="productCode" /&gt;&lt;/cell&gt;
              &lt;cell aid:table="cell" aid5:cellstyle="table_content" aid:crows="1" aid:ccols="1" aid:ccolwidth="120"&gt;&lt;xsl:value-of select="productName" /&gt;&lt;/cell&gt;
              &lt;cell aid:table="cell" aid5:cellstyle="table_content" aid:crows="1" aid:ccols="1" aid:ccolwidth="120"&gt;&lt;xsl:value-of select="productBrand" /&gt;&lt;/cell&gt;
              &lt;cell aid:table="cell" aid5:cellstyle="table_content" aid:crows="1" aid:ccols="1" aid:ccolwidth="61"&gt;&lt;xsl:value-of select="productNK" /&gt;&lt;/cell&gt;
           &lt;/xsl:for-each&gt;      
        &lt;/table&gt;
        &lt;xsl:text&gt;&amp;#xa;&lt;/xsl:text&gt;
     &lt;/xsl:template&gt;
  
     &lt;!-- PROMO CODES TEMPLATE --&gt;
     &lt;xsl:template match="promoCodes"&gt;
        &lt;table aid:table="table" aid:trows="5" aid:tcols="2"&gt;
           &lt;cell aid:table="cell" aid5:cellstyle="table_head" aid:crows="1" aid:ccols="1" aid:ccolwidth="62"&gt;Codes&lt;/cell&gt;
           &lt;cell aid:table="cell" aid5:cellstyle="table_head" aid:crows="1" aid:ccols="1" aid:ccolwidth="300"&gt;Instruction&lt;/cell&gt;
           &lt;xsl:for-each select="*"&gt;
              &lt;cell aid:table="cell" aid5:cellstyle="table_content" aid:crows="1" aid:ccols="1" aid:ccolwidth="62"&gt;&lt;xsl:value-of select="promoCode" /&gt;&lt;/cell&gt;
              &lt;cell aid:table="cell" aid5:cellstyle="table_content" aid:crows="1" aid:ccols="1" aid:ccolwidth="300"&gt;&lt;xsl:value-of select="instruction" /&gt;&lt;/cell&gt;
           &lt;/xsl:for-each&gt;
        &lt;/table&gt;
        &lt;xsl:text&gt;&amp;#xa;&lt;/xsl:text&gt;
     &lt;/xsl:template&gt;
  
  &lt;/xsl:stylesheet&gt;
  </code></pre>
  
  <p>The problem can be found in products template. As you can probably see, my XML code is quite complicated. There is a lot of unique nodes like ProductNr1, ProductNr2 and so on. Unfortunately, these nodes can't be replaced by one tag (ie: "product") because the XML is exported from Excel (in my case it requires unique tag per column). In order to build InDesign's table, I need to count its rows (all children of "products" + 1). My XPATH is supposed to do that, but when I'm using it, InDesign refuses to import the XML. I assume this is  because the calculated number of rows for products table isn't right.</p>
  
  <p>What am I doing wrong?</p>