XslCompiledTransform вызывает горе с Infopath

Я не разработчик Infopath, и это моя первая настоящая встреча с XSLT. В последнее время мне приходилось работать над проектом, в котором мне нужно было преобразовать форму информационного пути, загруженную в Sharepoint, в html. Оказавшись в html, мы можем использовать любую стороннюю библиотеку, чтобы выложить любой желаемый / поддерживаемый формат, который мы хотим.

Что мы делаем в коде:

  1. Мы создаем объект XslCompiledTransform. Это делается путем анализа Xsn, загруженного в sharepoint, и последующего использования Xsl. Мы используем View1.xsl. Никаких проблем здесь не происходит.
  2. Форма Xml возвращается в виде потока в наш метод преобразования, где мы создаем XmlDocument, к которому необходимо применить преобразование для использования потока.
  3. Затем мы передаем XmlDocument в метод transform() вместе с объектом XmlTextWriter, который заполняет для нас объект StringWriter. Затем мы можем использовать StringWriter, чтобы предоставить нам html в виде строки или потока и передать его в стороннюю библиотеку для изменения любого формата, например PDF/MHT и т. Д....

Проблема, возникающая после трансформации:

  1. Я теряю DateFormatting. Дата, изначально установленная как 1-12-2009, станет 2009-1-12
  2. Я теряю изображения, вместо изображений мы получаем пустые заполнители изображений с "X" в них.
  3. Я теряю разделы Master Detail.
  4. Проходят все элементы управления html. В настоящее время я преобразую поток html в строку и имею универсальный метод, который отфильтровывает любой нежелательный html. Также есть часть моего кода, которая отфильтровывает выбранные значения в выпадающих списках. При этом я столкнулся со сценарием, в котором не было атрибута "Выбрано" в html, но в выпадающем списке выбрано значение. ЭТОТ ЦЕЛЬНЫЙ ПАРСИНГ НЕ БЛАГОДАРЕН, ЕГО ХАК. Есть лучший способ сделать это?
  5. Как я могу обнаружить представления, если в файле XSN есть несколько представлений.
  6. Существует ли более простой способ преобразования, при котором достаточно передать XML-документ, что-то вроде метода XmlForm.CurrentView.Export() для обработки моего конкретного сценария.

Любые предложения, указатель и т. Д. Будет высоко ценится. Я счастлив отправить исходный Xml и преобразованный Html и Html, оставленные после того, как мой метод очистил его.

Заранее спасибо.

Мухаммад.

2 ответа

Этот вопрос довольно большой и расплывчатый. Вы получите лучшие ответы, если сможете разрезать его на более мелкие куски: где именно, что идет не так? Если вы определите, какая фаза вызывает какую-то проблему, и зададите конкретный вопрос, у вас гораздо больше шансов получить ответ от кого-то, кто может помочь.

Сказав это, есть несколько общих советов, которые могут помочь вам начать:

  1. Ваша проблема форматирования даты и времени вряд ли связана с XSL. XSLT, как правило, не очень хорошо выполняет форматирование строк, поэтому, если кто-то не написал довольно длинное и сложное XSLT-преобразование как часть вашего "View1.xsl", XSLT просто выплевывает дату так же, как она поступает - так что ваша проблема с датой вероятно происходит до шага XSLT.
  2. Похоже, ваши изображения ссылаются на неработающие ссылки. Выходной HTML, вероятно, содержит <img> теги с src атрибуты, которые указывают на несуществующие местоположения - выясните, где эти изображения должны быть, и исправьте ссылки. Это может быть так просто, как включение соответствующего <base> тег в выходной HTML.

Это интересная идея. Но я не думаю, что вы когда-нибудь заставите его работать к вашему удовольствию. XHTML, созданный преобразованием xsl, которое вы извлекаете из xsn, предназначено для отображения только в InfoPath. В XHTML встроено множество специальных функций InfoPath. Вы можете получить что-то наполовину полезное, но вы столкнетесь с большим количеством неработающих или странных проблем с отображением.

Например, функциональность master-detail реализована с помощью атрибута xd: connectedToMaster. URI пространства имен xd: http://schemas.microsoft.com/office/infopath/2003.
Все ссылки на это пространство имен (а их много) реализуют специфические функциональные возможности InfoPath, которые не будут реализованы ни в каком другом XHTML-рендерере.

Единственный способ заставить эту реализацию работать - реализовать всю функциональность, используемую пространством имен xd, в пользовательском рендерере XHTML. Удачи с этим.
Извините, у меня нет хороших новостей.

Другие вопросы по тегам