Вы действительно не объяснили, какая проблема возникла с вашим текущим подходом, но я думаю, что это вытекает из правила о том, как xsl:with-param
оценивается, если вы посмотрите на https://www.w3.org/TR/xslt-10/#element-with-param, оно говорит
Текущий узел и текущий список узлов, используемых для вычисления значения
указанный в xsl: with-param элемент такой же, как и используемый для
xsl: apply-templates или элемент xsl: call-template, внутри которого он
происходит
соответственно XSLT 3 определяет в https://www.w3.org/TR/xslt-30/#element-with-param, что
Фокус, используемый для вычисления значения, указанного в xsl: with-param
Элемент такой же, как используется для его родительской инструкции.
Это означает, что если внешний контекст / фокус вашего xsl:apply-templates
имеет дочернего элемента myElement
, выбранного вами для apply-templates
, в xsl:with-param
вам необходимо использовать <xsl:with-param name="paramAttr" select="myElement/@attribute1
"/> в качестве xsl:apply-templates
не меняет контекст / фокус для его внутреннего xsl:with-param
. Конечно, используя переменную, например,
<xsl:variable name="el" select="myElement"/>
<xsl:apply-templates select="$el">
<xsl:with-param name="paramAttr" select="$el/@attribute1"/>
</xsl:apply-templates>
может сделать этот подход короче и более читабельным. Если имеется несколько myElement
элементов, то лучше изменить контекст / фокус либо с помощью
<xsl:for-each select="myElement">
<xsl:apply-templates select=".">
<xsl:with-param name="paramAttr" select="@attribute1"/>
</xsl:apply-templates>
</xsl:for-each>
или сначала нажмите элемент myElement
в шаблоне, где вы затем продолжите обработку атрибутов.