XSLT - это функциональный язык, а не процедурный; то, что большинство новичков в XSLT не осознают, - это то, что процессор XSLT автоматически обрабатывает каждый узел в дереве в порядке их появления в источнике. Однако без шаблона, определяющего, что делать с каждым узлом, ничего не выводится.
В большинстве случаев вам не нужно использовать <xsl:for-each>
просто для обработки дочерних элементов, это уже сделано для вас, вам просто нужно определить шаблон, который описывает, как вы хотите, чтобы каждый элемент выводился. Как это:
<xsl:template match="root">
<xsl:apply-templates />
<xsl:text>Trailer - recordCount - </xsl:text>
<xsl:value-of select="count(DetailRecord)" />
</xsl:template>
<xsl:template match="HeaderField | CustomerNumber | Address">
<xsl:value-of select="concat(.,$newline)" />
</xsl:template>
<xsl:template match="DetailSubRecord">
<!-- do something with subrecord here -->
<xsl:apply-templates />
</xsl:template>
<xsl:apply-templates />
в первом шаблоне просто указывает процессору XSLT работать с дочерними элементами, после чего он добавляет в счетчик записей.
Второй шаблон обрабатывает любой элемент с тремя именами в его match
atrtibute и в каждом случае выводит содержимое (.
), объединенное с новой строкой.
Третий шаблон в его текущей форме на самом деле излишен, процессор все равно сделает это, но вы можете заменить этот комментарий чем-то более полезным.
Вы заметите, что это не дает никакой информации о том, как обрабатывать элемент DetailRecord
; поскольку все, что вы хотите сделать, это обработать его дочерние элементы, вам не нужно ничего указывать, поскольку это воспринимается как данность.