Передача параметра для шаблона применения выберите в xlst, .net - PullRequest
2 голосов
/ 18 февраля 2011

В моем файле xslt есть следующее:

<xsl:param name="predicate" select="//Event" />
<xsl:apply-templates select="$predicate" />

И это прекрасно работает, но теперь я бы хотел изменить параметр из моего кода .net.

var args = new XsltArgumentList();
args.AddParam("predicate", "", "//Event[@valid]");
xmlviewer.TransformArgumentList = args;

но независимо от того, что я передаю для предиката, я получаю ошибку "Выражение должно вычисляться для набора узлов."

Можно ли передать селектор xpath в преобразование?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2011
args.AddParam("predicate", "", "//Event[@valid]");

Вы передаете в таблицу стилей только строку, но таблица стилей использует параметр predicate в качестве набора узлов - для него выполняется <xsl:apply-templates>.

Решение

Оцените выражение XPath, которое вы сейчас передаете, в виде строки. Например, используйте Select() метод XPathNavigator . Затем передайте в качестве параметра для преобразования полученный XPathNodeIterator .

0 голосов
/ 18 февраля 2011

В конечном счете, $predicate здесь есть строка "//Event[@valid]" - вы по существу сделали:

<xsl:apply-templates select="'//Event[@valid]'"/>

т.е. попытался оценить шаблон на строку. Это не может работать. Вы можете , однако, проверьте для значений из @valid, например

<xsl:param name="valid" select="" />
<xsl:apply-templates select="//Event[@valid=$valid]" />

Конечно, поскольку xslt - это xml, другой способ решения этой проблемы - загрузить xslt в DOM и заменить выражение xpath перед выполнением.

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