XslCompiledTransform вызывает горе с Infopath
Я не разработчик Infopath, и это моя первая настоящая встреча с XSLT. В последнее время мне приходилось работать над проектом, в котором мне нужно было преобразовать форму информационного пути, загруженную в Sharepoint, в html. Оказавшись в html, мы можем использовать любую стороннюю библиотеку, чтобы выложить любой желаемый / поддерживаемый формат, который мы хотим.
Что мы делаем в коде:
- Мы создаем объект XslCompiledTransform. Это делается путем анализа Xsn, загруженного в sharepoint, и последующего использования Xsl. Мы используем View1.xsl. Никаких проблем здесь не происходит.
- Форма Xml возвращается в виде потока в наш метод преобразования, где мы создаем XmlDocument, к которому необходимо применить преобразование для использования потока.
- Затем мы передаем XmlDocument в метод transform() вместе с объектом XmlTextWriter, который заполняет для нас объект StringWriter. Затем мы можем использовать StringWriter, чтобы предоставить нам html в виде строки или потока и передать его в стороннюю библиотеку для изменения любого формата, например PDF/MHT и т. Д....
Проблема, возникающая после трансформации:
- Я теряю DateFormatting. Дата, изначально установленная как 1-12-2009, станет 2009-1-12
- Я теряю изображения, вместо изображений мы получаем пустые заполнители изображений с "X" в них.
- Я теряю разделы Master Detail.
- Проходят все элементы управления html. В настоящее время я преобразую поток html в строку и имею универсальный метод, который отфильтровывает любой нежелательный html. Также есть часть моего кода, которая отфильтровывает выбранные значения в выпадающих списках. При этом я столкнулся со сценарием, в котором не было атрибута "Выбрано" в html, но в выпадающем списке выбрано значение. ЭТОТ ЦЕЛЬНЫЙ ПАРСИНГ НЕ БЛАГОДАРЕН, ЕГО ХАК. Есть лучший способ сделать это?
- Как я могу обнаружить представления, если в файле XSN есть несколько представлений.
- Существует ли более простой способ преобразования, при котором достаточно передать XML-документ, что-то вроде метода XmlForm.CurrentView.Export() для обработки моего конкретного сценария.
Любые предложения, указатель и т. Д. Будет высоко ценится. Я счастлив отправить исходный Xml и преобразованный Html и Html, оставленные после того, как мой метод очистил его.
Заранее спасибо.
Мухаммад.
2 ответа
Этот вопрос довольно большой и расплывчатый. Вы получите лучшие ответы, если сможете разрезать его на более мелкие куски: где именно, что идет не так? Если вы определите, какая фаза вызывает какую-то проблему, и зададите конкретный вопрос, у вас гораздо больше шансов получить ответ от кого-то, кто может помочь.
Сказав это, есть несколько общих советов, которые могут помочь вам начать:
- Ваша проблема форматирования даты и времени вряд ли связана с XSL. XSLT, как правило, не очень хорошо выполняет форматирование строк, поэтому, если кто-то не написал довольно длинное и сложное XSLT-преобразование как часть вашего "View1.xsl", XSLT просто выплевывает дату так же, как она поступает - так что ваша проблема с датой вероятно происходит до шага XSLT.
- Похоже, ваши изображения ссылаются на неработающие ссылки. Выходной 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. Удачи с этим.
Извините, у меня нет хороших новостей.