• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

XSLT и т.д.

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
55
Тема по общим вопросам и проблемам, возникающим при работе с XSLT.

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

Примеры использования XSLT:
link removed
Rtf данные в Web таблицу
Конвертация и "офисные" форматы
IText

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

1. Стандартный xslt-парсер Java отказывается что-либо делать пока из xml вручную не уберёшь xmlns='' в строке:
XML:
<document xmlns='http://www.lotus.com/dxl' ... >
2. xslt-парсер msxml2.DOMDocument (скрипт ) говорит, что 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
7 940
609
BIT
210
удалять ns не недо, надо его добавить в xslt
например так xmlns:ldn="http://www.lotus.com/dxl" (в атрибутах тега <xsl:stylesheet .... > )
разумеется ссылаться на доминошные ноды надо с учётом префикса, типа <xsl:template match="ldn:document">
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
55
Попробую обязательно, спасибо!
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
55
О, здорово. После зачистки всех $-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=" link removed" не помогает.
Вот
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 783
157
BIT
55
Ещё вопрос.
Можно ли культурно как-то сделать, чтобы после xsl-преобразования Java-Transformer вернул xml без первой строки, т.е. без <?xml version='1.0' encoding='...'?>?

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
здесь обсуждался проект по трансформации доминошного РТ в 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>
Добавлено: и, кстати, ты числишься в этом проекте :) link removed
 
Последнее редактирование модератором:

VladSh

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

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
Для простоты работы можно поставить себе ИДЕ (какая понравится) для ХМЛ и тестировать там трансформации
в нормальных есть даже трассировка
 

Eugen

Green Team
22.03.2012
210
1
BIT
1
а онлайн не подойдет? пользуюсь сервисом
и notepad++ с плагинами для xml.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
а онлайн не подойдет? пользуюсь сервисом
и notepad++ с плагинами для xml.
судя по морокам - нет :(

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

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

seoman2

Green Team
17.02.2010
502
1
BIT
36
VladSh, а волт в посте #4, есть пример XSL для XML полученной в результате CreateDXLExporter.
Как его заставили работать?
 

VladSh

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!