g++ -Wall -Weffc++ -Werror -pedantic
, Когда я использую Повышение, тем не менее, я раскрываю его к:
g++ -Wall -Werror
я с тревогой жду GCC 4.4 и 4.5, все же. Существуют некоторые функции, прибывающие это, мне действительно плохо нужно.
Посетите http://www.exslt.org/ . В частности, посмотрите на модуль dynamic: Assessment.
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);
Попробуйте вариант этого:
<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 , как и на этой странице .