Ваш вопрос немного неясен. Я думаю, что вы пытаетесь сделать, это выдать текст всех дочерних элементов элемента marker
, разделенных табуляцией, в виде строки текста, оканчивающейся новой строкой. Это правильно?
Если это так, я не вижу никакой пользы от создания переменной, содержащей элементы classRef
, все соединенные вместе - вы не относитесь к ним иначе, чем к другим элементам. Вы можете просто использовать простой шаблон для преобразования каждого элемента marker
в строку вывода:
<!-- It's really only worth doing this if your transform uses lots of tabs
and newlines, which this one no longer does. But it aids readability
and reduces the number of typos you'll make, so it's a good habit to
get into. -->
<xsl:variable name="tab">	</xsl:variable>
<xsl:variable name="newline">
</xsl:variable>
<xsl:template match="marker">
<xsl:for-each select="*">
<xsl:if test="position() != 1">
<xsl:value-of select="$tab"/>
</xsl:if>
<xsl:value-of select="."/>
</xsl:for-each>
<xsl:value-of select="$newline"/>
</xsl:template>
Edit:
Хорошо, пример, который вы опубликовали, проясняет, что вы ищете. То, что вы хотите, это одна строка в выводе для каждого элемента classRef
, а не для каждого элемента marker
. Каждая строка должна иметь одинаковое количество вкладок и заканчиваться символом новой строки. Но строка first для любого данного элемента marker
должна содержать данные для не classRef
элементов, в то время как остальные строки должны содержать данные только для элементов classRef
.
Это должно сработать:
<xsl:template match="marker">
<xsl:apply-templates select="classRef"/>
</xsl:template>
<xsl:template match="classRef[position() = 1]">
<xsl:variable name="current" select="."/>
<xsl:for-each select="../*[name() != 'classRef' or . = $current]">
<xsl:if test="position() != 1">
<xsl:value-of select="$tab"/>
</xsl:if>
<xsl:value-of select="."/>
</xsl:for-each>
<xsl:value-of select="$newline"/>
</xsl:template>
<xsl:template match="classRef">
<xsl:variable name="current" select="."/>
<xsl:for-each select="../*[name() != 'classRef' or . = $current]">
<xsl:if test="position() != 1">
<xsl:value-of select="$tab"/>
</xsl:if>
<xsl:if test=". = $current">
<xsl:value-of select="."/>
</xsl:if>
</xsl:for-each>
<xsl:value-of select="$newline"/>
</xsl:template>