Действительно ли возможно использовать Динамическое выражение XPath в xslt таблице стилей?

g++ -Wall -Weffc++ -Werror -pedantic

, Когда я использую Повышение, тем не менее, я раскрываю его к:

g++ -Wall -Werror

я с тревогой жду GCC 4.4 и 4.5, все же. Существуют некоторые функции, прибывающие это, мне действительно плохо нужно.

6
задан Alan Storm 24 December 2011 в 17:15
поделиться

3 ответа

Посетите http://www.exslt.org/ . В частности, посмотрите на модуль dynamic: Assessment.

5
ответ дан 9 December 2019 в 20:45
поделиться

XSLT не поддерживает динамическую оценку XPath - поэтому для этого вам нужно использовать функцию расширения, такую ​​как EXSLT оценить .

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

Изменить

О фигурных скобках: это шаблоны значений атрибутов (AVT). Они семантически эквивалентны в преобразовании XSLT:

<foo>
   <xsl:attribute name="bar">
      <xsl:value-of select="XPathExpression"/>
   </xsl:attribute>
</foo>

<foo bar="{XPathExpression}"/>

Второй - это просто ярлык для первого.

О переменных и параметрах: Синтаксически нет разницы между переменной и параметром; везде, где вы ссылаетесь на $ foo в выражении XPath, он будет работать одинаково независимо от того, определяется ли foo с помощью xsl: variable или xsl: param

Разница между ними в том, как они заселяются. Переменные заполняются в объявлении xsl: variable . Параметры объявляются в именованном шаблоне с использованием xsl: param , но они заполняются любыми вызовами именованного шаблона с использованием xsl: with-param , например:

<xsl:call-template name="foo">
   <xsl:with-param name="bar" select="XPathExpression"/>
</xsl:call-template>

<xsl:template name="foo">
   <xsl:param name="bar"/>
   ...

Большой Исключением являются параметры, которые являются дочерними для xsl: stylesheet . Невозможно заполнить эти параметры внутри преобразования; они заполняются извне, каким-либо (зависящим от среды) механизмом, вызывающим преобразование.

Довольно распространенный вариант использования - компенсировать тот факт, что XSLT не имеет функции системной даты. Итак, вы увидите что-то вроде:

<xsl:stylesheet ...
   <xsl:param name="system-date"/>
   ...

, а затем, при вызове преобразования, что-то вроде этого (в C #):

XsltArgumentList args = new XsltArgumentList();
args.AddParam("system-date", "", DateTime.Now.ToString("s"));
xslt.Transform(input, args, result);
4
ответ дан 9 December 2019 в 20:45
поделиться

Попробуйте вариант этого:

<xsl:if test="not($var_myparam = 'no'))">
</xsl:if>

Проблема в том, как XPath вычисляет логические значения. Любая непустая строка будет оцениваться как истина в XPath. Ознакомьтесь с этой статьей о булевых значениях xpath .

Что касается других ваших вопросов ... Переменные и параметры действуют так же, как друг друга в выражениях XPath. Обе ссылки имеют форму $ var.

Для любого атрибута XSLT с именем «select» скобки не нужны. Скобки используются в так называемых «шаблонах значений атрибутов». Вы используете их, когда XSLT ожидает строку, например:

<xsl:template match="name-a">
  <xsl:variable name="old-name" select="name(.)" />
  <name-b old-name="{$old-name}" new-attribute="hello"  />
</xsl:template>

В спецификации XSLT говорится об AVT , как и на этой странице .

3
ответ дан 9 December 2019 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: