2009-03-11 5 views
5

Я пытаюсь использовать переменные XSLT и не имею большого успеха, надеюсь, я просто делаю что-то немое.Почему мои переменные XSLT не заменяют их значения?

У меня есть следующий фрагмент кода:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xalan="http://xml.apache.org/xslt" 
    version="1.0"> 

    <xsl:template match="/"> 
     <xsl:variable name="config" select="query/@config"></xsl:variable> 

, так что я ожидаю, чтобы быть переменными «конфиг» установлено в значение «конфигурация» атрибут моего верхнего уровня элемента 'запроса.

Затем я пытаюсь использовать переменную позже в моей таблице стилей, например:

<a href="localhost/test?go"> 
    {$config} 
</a> 

но выход я вижу в моем выходном HTML документе:

<a href="localhost/test?go"> 
    {$config} 
</a> 

так что значение имеет не был заменен, как я ожидал.

Я думаю, что это почти самый простой случай, который может быть, поэтому я делаю глупость! Пожалуйста, помогите, спасибо!


UPDATE спасибо всем, кто откликнулся, я понял различные контексты, был ли я работать в атрибуте или за ее пределами. Сортировалась моя проблема!

Если бы я мог, я бы принял два ответа: тот, который у меня есть, и @Aaron Digulla's, который объяснил атрибуты.

ответ

12

В таблице стилей вы должны использовать:

<xsl:value-of select="$config"/> 

вместо:

{$config} 
3

Использовать <xsl:value-of select="$config"/> вместо {$config}.

+0

Beat me to the;) – Kezzer

+0

@ Kezzer: Вот почему они платят мне большие деньги <('_' <) – Welbog

0

Потому что вам нужно использовать <xsl:value-of select="config"/>?

+3

Если config - переменная, мы должны использовать $ config, no? – bortzmeyer

6

{$config} работает только в атрибутах XSLT элементов. (Примечание: доллар внутри скобки, потому что полное выражение XPath должно быть окружено фигурными скобками)

+0

Зачем нужно, чтобы $ была перед открывающей скобой? Никогда этого не видел. –

+0

@divo: потому что это синтаксис. – Welbog

+0

Нет, это не так;) См. Http://www.w3.org/TR/xslt#attribute-value-templates: –

12

Здесь два вопроса, которые кажутся одинаковыми, но которые отличаются друг от друга: 1) Как ссылаться на переменную по имени ? 2) Где Я могу ссылаться на переменную по имени?

Во-первых, переменные всегда ссылаются на синтаксис $varname. Во-вторых, это можно сделать в любом месте разрешено выражение. Это вторая часть, которая, похоже, запутывает. Начнем с того, значение элемента или атрибута по умолчанию будет выводиться в буквальном смысле, так что никакие переменные фактически не упоминаются в следующем примере:

<element attr="$test">$test or {$test}</element> 

Выход буквально соответствует тому, что было напечатано.

Чтобы вывести значение переменной, нам нужно ссылаться на него, где разрешено выражение. В содержании элементов мы используем xsl:value-of; в атрибутах, которые обрабатываются как Attribute Value Template (например,атрибуты элемента с литеральным результатом), выражения ограничены фигурными фигурными скобками {}. Предположим следующее заявление:

<xsl:variable name="test" select="'value'"/> 

... тогда следующее:

<element attr="{$test}"><xsl:value-of select="$test"/></element> 

... Результаты в:

<element attr="value">value</element> 

Несколько прощальных записок по AVTS и value-of:

  • В обоих случаях переменная была реферирована ced как $test. Скобки в AVT не являются частью ссылки на переменные; они являются разделителями выражений.
  • В любом случае выражение не должно содержать ссылку на переменную; любое выражение XPath было бы разрешено.
  • Не все атрибуты в документе XSLT рассматриваются как шаблоны значений атрибутов. Например, обратите внимание, что атрибут xsl:valueselectуже принимает в качестве контента выражение.
  • Вопрос: Почему вы не можете использовать value-of в атрибуте, например?

    <element attr="<xsl:value-of select="$test"/>"/> 
    

    Ответ: Поскольку XSLT документы должны содержать хорошо сформированные XML (и что не является).

  • Вопрос: Почему вы не можете использовать {$varname} в содержании элемента?

    Глиб-ответ: потому что создатели XSLT не разработали его таким образом.

+0

Взгляните на ответ, который я добавил: последний вопрос/ответ в вашем ответе. Не уверен, что вы еще это видели (так как ваш ответ настолько старый). –

+0

Благодарим за столь четкое объяснение различных синтаксисов ссылок на переменные в разных местах. Я нашел это при поиске объяснений в синтаксисе {}. Благодаря! – levininja

1

@ Ответ lwburk отличный (+1), но последний вопрос/ответ является точным только для XSLT 1.0 и 2.0. В версии 3.0 вы можете использовать TVT (Text Value Template, похожий на AVT (шаблон значения атрибута), упомянутый в ответе @ lwburk).

Чтобы использовать TVT, добавьте к элементу стандартный атрибут xsl:expand-text="yes". Это заставит процессор обрабатывать текстовые узлы этого элемента в виде ТВТ.

Пример:

XSLT-3,0

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" omit-xml-declaration="yes"/> 

    <xsl:template match="/"> 
     <xsl:variable name="who" select="'Dan'"/> 
     <xsl:variable name="what" select="'BAM!'"/> 
     <result xsl:expand-text="yes">This is {$who}'s result: {$what}</result> 
    </xsl:template> 

</xsl:stylesheet> 

Выход (с использованием любой хорошо сформированный XML в качестве входных данных)

<result>This is Dan's result: BAM!</result> 

Примечание: Испытано с помощью саксонская-ПЭ 9.5 ,

+0

+1 Спасибо за добавление ответа XSLT 3.0. –

Смежные вопросы