XSLT и т.д.

VladSh

начинающий
Lotus team
11.12.2009
1 260
5
#1
Тема по общим вопросам и проблемам, возникающим при работе с XSLT.

Ссылки на смежные темы:
Валидация XML
XSLT Saxon

Примеры использования XSLT:
Интеграция с текстовыми процессорами офисных пакетов (новая версия)
Rtf данные в Web таблицу
Конвертация и "офисные" форматы
IText

При попытке обработки различными xslt-парсерами строки с XML дока, полученной DXLExporter'ом, возникают проблемы:

1. Стандартный xslt-парсер Java отказывается что-либо делать пока из xml вручную не уберёшь xmlns='' в строке:
XML:
<document xmlns='http://www.lotus.com/dxl' ... >
2. xslt-парсер msxml2.DOMDocument (скрипт XMLValidator.js) говорит, что xml не корректный (подробнее ):
Validation error(...):
Элемент ''document'' используется, но не был объявлен в DTD/Schema.
Дальше работать MS-парсеры xml (DOM/SAX) отказываются.

3. Тестировал работу схемы online здесь , так этот парсер не пропускает наименования item'ов, начинающихся со знака доллара.

Предвижу ещё проблемы... Делитесь! :)

Как я понимаю, в основном это проблемы сторонних парсеров и изредка самой xml'ины, но люди говорят "вы представляете некорректный xml", т.е. как-то надо с этим бороться.
Например, проблема 3 может решаться на уровне DXLExporter'а (если своих item'ов таких нет), проблема 1 может решаться ручным удалением xmlns='' из xml, 2-ю проблему вообще не знаю как решить...
Поделитесь, пожалуйста, своим опытом. Может есть какие-либо культурные методы, на уровне выставления свойств парсеров?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#2
удалять ns не недо, надо его добавить в xslt
например так xmlns:ldn="http://www.lotus.com/dxl" (в атрибутах тега <xsl:stylesheet .... > )
разумеется ссылаться на доминошные ноды надо с учётом префикса, типа <xsl:template match="ldn:document">
 

VladSh

начинающий
Lotus team
11.12.2009
1 260
5
#4
О, здорово. После зачистки всех $-item'ов и т.п., ко всему прочему, стала вылетать:
Неустранимая ошибка: 'com.ibm.xml.xlxp.api.util.IOExceptionWrapper: C:\Program Files\Lotus\Notes\notes8\framework\xmlschemas\domino_8_5_3.dtd (Системе не удается найти указанный путь.)'
Странно, что схема ищется по этому пути, т.к. она находится в C:\Program Files\Lotus\Notes\notes8\xmlschemas\
Лотус переставлял, но ошибка не уходит.
Для эксперимента скопировал папку с темами по тому пути, что он просит, ошибка исчезла (это не выход - у всех будет то же самое). И всё равно ничего не возвращает.

Строка xmlns:ldn="
Для просмотра контента необходимо: Войти или зарегистрироваться
"
не помогает.
Вот
XML:
<?xml version="1.0"?>
<xsl:stylesheet
<!-- вставлял здесь, но до фонаря -->
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
 
<xsl:template match="/">
<document>
<xsl:for-each select="//item">
<xsl:element name="{@name}"><xsl:value-of select="."/></xsl:element>
 
</xsl:for-each>
</document>
</xsl:template>
 
</xsl:stylesheet>
Если вышеуказанную строку убрать из исходного xml'я,
а также убрать упоминание о !DOCTYPE document SYSTEM, - это можно сделать так:
Java:
dxlExporter.setOutputDOCTYPE(false);
то нормально преобразовывает.
Без этих финтов запустить у меня, видимо, ума не хватило.
 

VladSh

начинающий
Lotus team
11.12.2009
1 260
5
#5
Ещё вопрос.
Можно ли культурно как-то сделать, чтобы после xsl-преобразования Java-Transformer вернул xml без первой строки, т.е. без <?xml version='1.0' encoding='...'?>?

Добавлено:
О-ёй! Этот вопрос решён:
Java:
tranfsormer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#6
здесь обсуждался проект по трансформации доминошного РТ в FOP (для получения PDF)...
вот ХСЛТ для него:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
 
http://www.apache.org/licenses/LICENSE-2.0
 
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- $Id$ -->
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ldn="http://www.lotus.com/dxl" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo">
<xsl:eek:utput method="xml" version="1.0" omit-xml-declaration="no" indent="yes"/>
<xsl:param name="versionParam" select="'1.0'"/>
<xsl:param name="body.font.family">Arial</xsl:param>
 
<!-- ================= -->
<!-- omit other nodes -->
<!-- ================= -->
<xsl:template match="ldn:document/*[name()!='item']"/>
 
<!-- ========================= -->
<!-- root element: document	-->
<!-- ========================= -->
<xsl:template match="ldn:document">
<fo:root font-family="Arial" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm" margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="simpleA4">
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="12pt" space-after="5mm">Version <xsl:value-of select="$versionParam"/>
</fo:block>
<fo:block font-size="10pt">
<xsl:apply-templates select="ldn:item"/>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
 
<!-- ========================= -->
<!-- child element: item	  -->
<!-- ========================= -->
<xsl:template match="ldn:item">
<!--lower case-->
<xsl:variable name="fname" select="translate(ldn:eek:bject/ldn:file/@name,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')"/>
<xsl:variable name="fdata" select="ldn:eek:bject/ldn:file/ldn:filedata/text()"/>
<xsl:choose>
<xsl:when test="string-length($fdata)!=0 and contains($fname, '.jpg')">
<fo:block font-size="10pt">
File Name:<xsl:value-of select="$fname"/>
</fo:block>
<fo:block font-size="10pt">
<xsl:element name="fo:external-graphic">
<!--		 <xsl:text>File Name:</xsl:text><xsl:value-of select="ldn:eek:bject/ldn:file/@name"/>
<xsl:text/>-->
<xsl:attribute name="content-width">scale-up-to-fit</xsl:attribute>
<xsl:attribute name="content-height">scale-to-fit</xsl:attribute>
<xsl:attribute name="scaling">uniform</xsl:attribute>
<xsl:attribute name="width">3cm</xsl:attribute>
<xsl:attribute name="src">url('data:image/jpeg;base64,<xsl:value-of select="$fdata"/>')</xsl:attribute>
</xsl:element>
</fo:block>
</xsl:when>
<xsl:when test="./node()[name()='richtext']">
<xsl:apply-templates match="ldn:richtext"/>
</xsl:when>
<xsl:eek:therwise>
</xsl:eek:therwise>
</xsl:choose>
</xsl:template>
 
<!-- ============================= -->
<!-- child element: item/richtext -->
<!-- ============================= -->
<xsl:template match="ldn:richtext">
<xsl:apply-templates select="ldn:par"/>
<!--			<xsl:apply-templates select="descendant::ldn:richtext/*[name()='par']/*[name()='objectref']/*[name()='picture']/*[name()='gif']"/>-->
<!--		 <fo:table table-layout="fixed" width="100%" border-collapse="separate">
<fo:table-column column-width="4cm"/>
<fo:table-column column-width="4cm"/>
<fo:table-column column-width="5cm"/>
<fo:table-body>
<xsl:apply-templates select="member"/>
</fo:table-body>
</fo:table>-->
<fo:block font-size="20pt">
<fo:internal-graphic source-resolution="72" src="8940thumb.jpg" content-width="scale-to-fit" content-height="scale-to-fit" scaling="uniform"/>
</fo:block>
</xsl:template>
<!-- <xsl:template match="ldn:pardef">
<xsl:variable name="fopardef">.par_<xsl:value-of select="$uid"/>_<xsl:value-of select="@id"/></xsl:variable>
<xsl:attribute-set name='$fopardef'>
</xsl:attribute-set>
</xsl:template>-->
 
<!-- ============================ -->
<!-- child element: richtext/par -->
<!-- ============================ -->
<xsl:template match="ldn:par">
<!--	<xsl:value-of select="ldn:eek:bjectref/ldn:picture/ldn:gif/text()"/>-->
<xsl:choose>
<xsl:when test="string-length(ldn:eek:bjectref/ldn:picture/ldn:gif/text())!=0">
<fo:block font-size="10pt">
<xsl:element name="fo:external-graphic">
<xsl:attribute name="content-width">scale-down-to-fit</xsl:attribute>
<xsl:attribute name="content-height">scale-to-fit</xsl:attribute>
<xsl:attribute name="scaling">uniform</xsl:attribute>
<xsl:attribute name="width">18cm</xsl:attribute>
<xsl:attribute name="src">url('data:image/gif;base64,<xsl:value-of select="."/>')</xsl:attribute>
</xsl:element>
</fo:block>
</xsl:when>
<xsl:eek:therwise>
<fo:block font-size="10pt">
<xsl:value-of select="./text()"/>
</fo:block>
</xsl:eek:therwise>
</xsl:choose>
</xsl:template>
 
<!-- <xsl:template match="member">
<fo:table-row>
<xsl:if test="function = 'lead'">
<xsl:attribute name="font-weight">bold</xsl:attribute>
</xsl:if>
<fo:table-cell>
<fo:block>
<xsl:value-of select="name"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:value-of select="function"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:value-of select="email"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:template>-->
</xsl:stylesheet>
Добавлено: и, кстати, ты числишься в этом проекте :)
Для просмотра контента необходимо: Войти или зарегистрироваться
 
Последнее редактирование модератором:

VladSh

начинающий
Lotus team
11.12.2009
1 260
5
#7
lmike
Спасибо! Точно видел это где-то здесь, но по поиску не смог найти. Отличный пример, как будто справочник по xslt)
По времени разберусь.. сейчас с модальностью диалога открытия/сохранения файла бьюсь, счас подниму ту тему.

Та да. Вот только руки дошли до Java, - первые шаги, можно сказать. Как только самое основное допедалю, то буду свободен. Если в проекте ещё есть, что делать, то присоединюсь. Меня и самого это убивает, что я там несколько лет уже наверное вишу, но ещё и пальцем не пошевелил.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#9
Для простоты работы можно поставить себе ИДЕ (какая понравится) для ХМЛ и тестировать там трансформации
в нормальных есть даже трассировка
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#11
а онлайн не подойдет? пользуюсь сервисом http://www.utilities-online.info/xsltransf...n/#.UMGNs0KYtMM
и notepad++ с плагинами для xml.
судя по морокам - нет :(

Завидую...
А вы его чем пишите? Есть какой-то вменяемый бесплатный редактор? Или всё только за деньги?
я пользую oXygen (сказал начальству - мне надо), он платен (500баксов), но есть триал и академическая версия (64бакса)

Добавлено: есть ориентированная на документацию тулза но я её подробно не смотрел, только докбук ковырял (но так и забросил)
 

seoman2

Lotus team
17.02.2010
458
1
#12
VladSh, а волт в посте #4, есть пример XSL для XML полученной в результате CreateDXLExporter.
Как его заставили работать?
 

VladSh

начинающий
Lotus team
11.12.2009
1 260
5
#13
seoman2
Работать заставил - на основе хэлпа и пары тем форума код написал. Но подход без неймспейсов неправильный. lmike в 6-м сообщении давал правильный пример xsl'я. Код трансформации под правильный XSL можете взять из проекта lmike.
Если нужны мои закарючки, то надо подготовить пример - там куча кода + доки, а это время; если будет всё ещё актуально, то постараюсь на выходных выложить.