public TableTag Parse(XElement startElement, XElement endTableTag)
        {
            var itemsSource = startElement.Value;
            if (string.IsNullOrEmpty(itemsSource))
            {
                throw new Exception(string.Format(MessageStrings.TagNotFoundOrEmpty, "Items"));
            }

            var tag = new TableTag
            {
                TagTable = startElement,
                TagEndTable = endTableTag,
                ItemsSource = itemsSource,
            };
            tag.MakeTableElementCallback = MakeTableElementCallback;
            int? dynamicRow = null;
            var rowCount = 1;
            //var between = TraverseUtils.SecondElementsBetween(startElement, endTableTag);
            var tableElement = startElement.NextSdt(WordMl.TableName).FirstOrDefault(element => element.IsBefore(endTableTag));
            var rows = TraverseUtils.SecondElementsBetween(startElement, endTableTag).Descendants(WordMl.TableRowName).Where(tr => tr.Parent.Equals(tableElement));
            //var tableElement = startElement.NextSdt(WordMl.TableName).FirstOrDefault(element => element.IsBefore(endTableTag));
            // TODO Extend sdt names in loop
            foreach (var tableRow in rows)
            {
                if (
                    tableRow.Descendants()
                            .Any(
                                el =>
                                el.IsTag(ItemIndexTagName) || el.IsTag(ItemTextTagName) || el.IsTag(ItemIfTagName) ||
                                el.IsTag(ItemHtmlContentTagName) || el.IsTag(ItemRepeaterTagName))) 
                {
                    if (dynamicRow != null)
                    {
                        throw new Exception("Invalid template! Found several dynamic rows. (Or none dynamic rows)");
                    }
                    dynamicRow = rowCount;
                }
                rowCount++;
            }
            
            if (tableElement != null)
            {
                tag.Table = tableElement;
            }

            tag.DynamicRow = dynamicRow;
            return tag;
        }        
 private void CheckTagElements(TableTag tag)
 {
     Assert.IsNotNull(tag.TagTable);
     Assert.AreEqual("Table", tag.TagTable.Element(WordMl.SdtPrName).Element(WordMl.TagName).Attribute(WordMl.ValAttributeName).Value);
   /*  Assert.IsNotNull(tag.TagContent);
     Assert.AreEqual("Content", tag.TagContent.Element(WordMl.SdtPrName).Element(WordMl.TagName).Attribute(WordMl.ValAttributeName).Value);
     Assert.IsNotNull(tag.TagEndContent);
     Assert.AreEqual("EndContent", tag.TagEndContent.Element(WordMl.SdtPrName).Element(WordMl.TagName).Attribute(WordMl.ValAttributeName).Value);
     Assert.IsNotNull(tag.TagEndTable);*/
     Assert.AreEqual("EndTable", tag.TagEndTable.Element(WordMl.SdtPrName).Element(WordMl.TagName).Attribute(WordMl.ValAttributeName).Value);
 }