Выбор наборов узлов (атрибутов или элементов), которые соответствуют имени строковой переменной - PullRequest
2 голосов
/ 19 августа 2009

Рассмотрим простой пример элемента xml:

<parent foo="1" bar="2" foobar="3">
    <child/>
</parent>

В xsl-файле я нахожусь в контексте "parent" (то есть внутри ). Я хочу выбрать набор узлов (в примере только один атрибут) на основе строковой переменной. Например, я хочу выбрать набор узлов, который соответствует $ attribute-name. Я покажу мой неудачный пример xsl, и вы, вероятно, поймете, что я пытаюсь сделать.

<xsl:template match="parent">
    <xsl:call-template name="print-value-of">
        <xsl:with-param name="attribute-type" select="'foo'"/>
    </xsl:call-template>
</xsl:template>

<xsl:template name="print-value-of">
    <xsl:param name="attribute-type"/>

    <xsl:value-of select="$attribute-type"/>
</xsl:template>

Это печатает вывод:

foo

То, что я сначала НАМЕРЕН, чтобы сделать (но я понимаю, что это не то, что он должен делать):

  1. оценить переменную атрибут - тип ( или param, если вы хотите быть разборчивым) как строка 'foo'
  2. вызвать значение-как если бы я вызвал

т.е. то, что я хотел напечатать, было:

1

ВОПРОС : Как мне добиться такого поведения?

Обратите внимание : Мне известно о том, что в этом простом случае я мог бы передать фактический узел атрибута в качестве параметра (т. Е. ). Но это не решение, которое я ищу. Мне нужно передать только информацию о типе атрибута (или имени атрибута, если вы хотите так его называть)

На самом деле я пытаюсь создать общий шаблон функции, который может:

  1. Вызов функции (шаблон вызова) с типом атрибута в качестве параметра
  2. В этой функции выполняется множество операций, которые дают мне набор узлов, сохраняемый в переменной
  3. сумма всех атрибутов элементов в наборе узлов, которые имеют ранее выбранный тип атрибута


Я могу использовать только XSLT 1.0, поэтому решения 1.0 гораздо предпочтительнее!

Последующий вопрос на похожую тему: Можно ли также создать атрибуты с именем / типом, указанным в строковой переменной? * 1061 Т.е. *

<xsl:attribute name="$attribute-type"/>

Выполнение этого, как показано выше, приводит к тому, что $ attribute-type является буквальным именем атрибута в выводе xml. Вместо этого я хотел бы, чтобы он снова вычислял переменную и давал оцененное значение в качестве имени.
</ EDIT2>

1 Ответ

3 голосов
/ 19 августа 2009

Выбирает атрибут с именем 'foo'.

<xsl:call-template name="print-value-of">
  <xsl:with-param name="attribute-type" select="@*[name() = 'foo']"/>
</xsl:call-template>

<xsl:template name="print-value-of">
   <xsl:param name="attribute-type"/>
   <xsl:value-of select="."/>
</xsl:template>

Кроме того, вы можете оставить <xsl:call-template> как есть и внести изменения в свой шаблон:

<xsl:template name="print-value-of">
  <xsl:param name="attribute-type"/>

  <xsl:value-of select="@*[name() = $attribute-type]"/>
</xsl:template>

В любом случае, если только это не был синтетический пример, все вышеперечисленное - довольно дорогой способ сказать:

<xsl:value-of select="@*[name() = $attribute-type]"/>

EDIT:

Чтобы создать атрибуты с динамическим именем, используйте:

<xsl:attribute name="{$attribute-type}">
  <xsl:value-of select="$some-value-or-expression" />
</xsl:attribute>

Обратите внимание, что фигурные скобки заставляют XSLT-процессор оценивать их содержимое (только в значениях атрибутов).

Вы должны убедиться, что $attribute-type содержит строку, соответствующую правилам именования XML. И вам следует подумать о переименовании переменной в $attribute-name, потому что это , что это такое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...