У меня есть несколько замечаний. Во-первых, плохая идея использовать формат в XML. Наличие элементов, которые называются <block-center>
или <block-center-colunm>
, не только неоправданно многословно, но и заставит вашу голову болеть, как только их содержимое больше не будет отображаться в блоке в центре.
Во-вторых, отпустите <xsl:call-template>
и <xsl:for-each>
. Они могут показаться удобными, если у вас есть опыт процедурного программирования, но это неправильный выбор. Вместо этого используйте <xsl:apply-templates>
, это приведет к тому, что код станет чище и проще для понимания.
Теперь к вашему XSL. Ваш второй XSL (block-center.xsl
) - что он делает? Почему у вас есть два отдельных файла XSL? Также отсутствует объявление переменной или параметра. Я использовал:
<xsl:variable name="pageId" select="'page-1'" />
для моих тестов. У него также есть только один шаблон (<xsl:template name="block-center">
), который фактически никогда не вызывается, поэтому он ничего не сделал для меня. Я добавил
<xsl:template match="/">
<xsl:call-template name="block-center" />
</xsl:template>
так что он хотя бы что-нибудь сделает.
Ваш другой XSL-файл (block-center-1-1.xsl
) имеет цикл for-each, который не смотрит в нужный контекст. Вы уже находитесь в следующем контексте при вводе шаблона "block-center-row-1
":
content/page[@id=$pageId]/block-center/block-center-row
, поэтому все, что вам нужно сделать в цикле for-each:
<xsl:for-each select="cd">
и он начнет выводить все <cd>
узлы.