используйте xsl: param для выбора атрибута в xsl: template - PullRequest
0 голосов
/ 08 ноября 2018

Мне нужно вывести 2 атрибута вида элемента. Я хотел бы использовать только 1 шаблон с одним параметром для сокращения кода.

XML похож на:

<myElement attribute1="x" attribute2="y" />

Я бы хотел назвать шаблоны следующим образом:

<xsl:apply-templates select="myElement">
   <xsl:with-param name="paramAttr" select="@attribute1" />
</xsl:apply-templates>

и

<xsl:apply-templates select="myElement">
  <xsl:with-param name="paramAttr" select="@attribute2" />
</xsl:apply-templates>

Проблема в определении шаблона:

<xsl:template match="myElement">
  <xsl:param name="paramAttr"/>

  <xsl:value-of select="$paramAttr" /> <!-- NOT ACCEPTED -->

</xsl:template>

Я пробовал разные вещи, например ввод @ в разных местах, с concat () или {} без особого успеха. Любая идея ? спасибо.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Вы действительно не объяснили, какая проблема возникла с вашим текущим подходом, но я думаю, что это вытекает из правила о том, как 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 в шаблоне, где вы затем продолжите обработку атрибутов.

0 голосов
/ 09 ноября 2018

Передать имя атрибута в виде строки:

<xsl:apply-templates select="myElement">
   <xsl:with-param name="paramAttr" select="'attribute1'" />
</xsl:apply-templates>

и выберите атрибут на основе его имени в вызываемом шаблоне:

<xsl:template match="myElement">
  <xsl:param name="paramAttr"/>
  <xsl:value-of select="@*[name() = $paramAttr]" />
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...