XSLT не поддерживает динамическую оценку XPath - поэтому для этого нужно использовать функцию расширения, например EXSLT evaluate
.
Если вы не хотите использовать функции расширения (и для этого есть веские причины), другой возможностью является запрос 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);