XSLT и т.д.

Тема в разделе "Lotus + Java + LS2J", создана пользователем VladSh, 20 июн 2012.

  1. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Тема по общим вопросам и проблемам, возникающим при работе с 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 не корректный (подробнее ):
    Дальше работать MS-парсеры xml (DOM/SAX) отказываются.

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

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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    удалять ns не недо, надо его добавить в xslt
    например так xmlns:ldn="http://www.lotus.com/dxl" (в атрибутах тега <xsl:stylesheet .... > )
    разумеется ссылаться на доминошные ноды надо с учётом префикса, типа <xsl:template match="ldn:document">
     
  3. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Попробую обязательно, спасибо!
     
  4. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    О, здорово. После зачистки всех $-item'ов и т.п., ко всему прочему, стала вылетать:
    Странно, что схема ищется по этому пути, т.к. она находится в C:\Program Files\Lotus\Notes\notes8\xmlschemas\
    Лотус переставлял, но ошибка не уходит.
    Для эксперимента скопировал папку с темами по тому пути, что он просит, ошибка исчезла (это не выход - у всех будет то же самое). И всё равно ничего не возвращает.

    Строка xmlns:ldn="http://www.lotus.com/dxl" не помогает.
    Вот
    Код (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);
    то нормально преобразовывает.
    Без этих финтов запустить у меня, видимо, ума не хватило.
     
  5. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Ещё вопрос.
    Можно ли культурно как-то сделать, чтобы после xsl-преобразования Java-Transformer вернул xml без первой строки, т.е. без <?xml version='1.0' encoding='...'?>?

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    здесь обсуждался проект по трансформации доминошного РТ в 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>
    Добавлено: и, кстати, ты числишься в этом проекте :) https://sites.google.com/site/lmiketonetwoo...ct/file-cabinet
     
    #6 lmike, 27 июн 2012
    Последнее редактирование модератором: 22 окт 2015
  7. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    lmike
    Спасибо! Точно видел это где-то здесь, но по поиску не смог найти. Отличный пример, как будто справочник по xslt)
    По времени разберусь.. сейчас с модальностью диалога открытия/сохранения файла бьюсь, счас подниму ту тему.

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

    maks77 Гость

    Отличный пример!
     
  9. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    Для простоты работы можно поставить себе ИДЕ (какая понравится) для ХМЛ и тестировать там трансформации
    в нормальных есть даже трассировка
     
  10. Eugen

    Eugen Well-Known Member

    Регистрация:
    22 мар 2012
    Сообщения:
    172
    Симпатии:
    0
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    судя по морокам - нет :(

    я пользую oXygen (сказал начальству - мне надо), он платен (500баксов), но есть триал и академическая версия (64бакса)

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

    seoman2 Lotus team
    Lotus team

    Регистрация:
    17 фев 2010
    Сообщения:
    435
    Симпатии:
    0
    VladSh, а волт в посте #4, есть пример XSL для XML полученной в результате CreateDXLExporter.
    Как его заставили работать?
     
  13. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    seoman2
    Работать заставил - на основе хэлпа и пары тем форума код написал. Но подход без неймспейсов неправильный. lmike в 6-м сообщении давал правильный пример xsl'я. Код трансформации под правильный XSL можете взять из проекта lmike.
    Если нужны мои закарючки, то надо подготовить пример - там куча кода + доки, а это время; если будет всё ещё актуально, то постараюсь на выходных выложить.
     
Загрузка...
Похожие Темы - XSLT
  1. Megaworld
    Ответов:
    0
    Просмотров:
    1.117
  2. Eugen
    Ответов:
    0
    Просмотров:
    1.289
  3. Eugen
    Ответов:
    70
    Просмотров:
    13.619
  4. lmike
    Ответов:
    0
    Просмотров:
    1.656

Поделиться этой страницей