"динамический" XSLT для управления веб-браузером? - PullRequest
2 голосов
/ 25 января 2009

Я часто использую вывод HTML в приложениях, до сих пор я использовал несколько простых процедур для построения строки HTML. Я хочу попробовать что-то другое сейчас:

Я хочу сериализовать данные в XML и предоставить несколько шаблонов XSLT для генерации HTML-кода для элемента управления веб-браузера. Я работаю статически (медленно копая в процессе написания XSL), но мне нужно на лету изменить некоторые атрибуты документа XSL: фильтры, пути и т. Д., Чтобы следовать текущему выбору пользовательского интерфейса.

Данные настолько малы, что сериализация XML при изменении не должна быть проблемой. Я хотел бы использовать «статические» внешние XSL-файлы (чтобы пользователь мог до определенной степени настроить вывод), но настроить.

Мои вопросы:

Эта идея технически обоснована?
Можно ли динамически загружать элемент управления веб-браузера с помощью XML и документа XSL? Могу ли я изменить выбранные элементы пути и атрибуты в XSL на лету (то есть без создания нового файла)? Как это сделать в веб-браузере? (некоторые указатели, чтобы начать меня, были бы хороши ..)

[edit] Спасибо, ребята, это работает: D [/ edit]

Ответы [ 3 ]

7 голосов
/ 25 января 2009

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

Обычно, когда я делаю это, я передаю только один параметр - документ XML - и заставляю шаблоны запрашивать его, чтобы определить, что они должны делать. Итак, вы увидите такие вещи, как:

<xsl:template match="*">
   <xsl:variable name="cfg" select="$config/*[name() = current()]"/>
   <xsl:choose>
      <xsl:when test="cfg/elementType = 'option'">
         <xsl:apply-templates select="." mode="option">
      <xsl:when test="cfg/elementType = 'optgroup'">
         <xsl:apply-templates select="." mode="optgroup">
      <xsl:when test="cfg/elementType = 'a'">
         <xsl:apply-templates select="." mode="a">

и т. Д.

Очень просто динамически передавать элемент управления WebBrowser с помощью XML / XSLT:

using (XmlWriter xw = XmlWriter.Create(new StringWriter(output)))
{
    StringBuilder output = new StringBuilder();
    XsltArgumentList args = new XsltArgumentList();
    args.AddParam("config", myConfigXml);
    myXslt.Transform(myXml, args, xw);
    xw.Flush();
    myWebBrowser.DocumentText = output.ToString();
}

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

3 голосов
/ 25 января 2009

XslCompiledTransform поддерживает параметры , а также объекты расширения (оба через XsltArgumentList. Для чего-нибудь простого попробуйте используйте параметр; объекты расширения предоставляют гораздо более широкие функциональные возможности (по вашему воображению), но не так переносимы для других поставщиков xslt. Третьим вариантом является внешний файл для параметров, загружаемый в переменную с xsl:document.

Конечно, если вы чувствуете себя смелым, вы можете использовать xslt для динамического написания xslt, хотя и не тривиально.

В большинстве нетривиальных случаев проще всего использовать WebBrowser против плоского файла (в области% tmp% или против локального веб-сервера (такого как HttpListener); изменение html напрямую имеет тенденцию оставить немного запутанным элемент управления для эффективного контекста безопасности.

1 голос
/ 25 января 2009

Я не знаю, как выглядит ваше приложение, поэтому я бы не сказал, хорошая это или плохая идея.

По другим вопросам:

Вы можете преобразовать данные в памяти и загрузить их в управление через веб-браузер. В противном случае вам нужно сохранить данные во временные файлы.

Вы можете делать выбор во время выполнения с параметрами XSLT

...