Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Преобразовать XML с помощью XSLT, используя XSD / 22 сообщений из 22, страница 1 из 1
05.04.2012, 12:11
    #37739971
Стас Агарков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
Скажите, пожалуйста, как сделать такое XSLT-преобразование, которое бы обработало входной XML и удалило из него теги, непомеченные специальным элементом в аннотации к тегу в XSD элементу и заменило бы имя тега на имя из специального элемента из аннотации.
...
Рейтинг: 0 / 0
05.04.2012, 12:57
    #37740076
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
Да вот брать и делать. Вопрос в чем?
...
Рейтинг: 0 / 0
05.04.2012, 13:47
    #37740196
Стас Агарков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
_Vasilisk_,

Вы можете показать пример, документацию или что-то еще по теме моей задачи?
...
Рейтинг: 0 / 0
05.04.2012, 14:42
    #37740313
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
Стас Агарков, я просто не могу понять в чем проблема? Документацию по чем? Что уникального в Вашей задаче по сравнению с другой? Вам нужно пара шаблонов и функция document(). Все.
...
Рейтинг: 0 / 0
05.04.2012, 14:49
    #37740332
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
_Vasilisk_
Вероятно автор имеет ввиду решение в общем случае. Типа есть набор произвольных пар xml+xsd, нужен такой универсальный xsl, который на основании xsd смог бы привести к нужному виду любой xml.

Или я не так понял?
...
Рейтинг: 0 / 0
05.04.2012, 14:50
    #37740333
Стас Агарков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
_Vasilisk_,

Можете объяснить как написать эти пару шаблонов? Я не могу разобраться...
...
Рейтинг: 0 / 0
05.04.2012, 14:50
    #37740336
Стас Агарков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
Antonariy,

вы правильно поняли!
...
Рейтинг: 0 / 0
05.04.2012, 14:57
    #37740353
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
Это невозможно.
...
Рейтинг: 0 / 0
05.04.2012, 15:01
    #37740367
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
По крайней мере с помощью xsl.
...
Рейтинг: 0 / 0
05.04.2012, 15:02
    #37740372
Стас Агарков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
Antonariy,

Возникла идея сделать в два этапа: написать XSLT, которая из XSD будет строить второй XSLT для текущей схемы документы, а потом с помощью второй XSLT преобразовывать реальный документ в нужный вид.
Такое можно провернуть?

P.S. Если мне нужно вытянуть xs:element в xs:element, то какое выражение мне нужно написать в select? Пишу "xs:element/*/xs:element" — не работает, а так "xs:element/**/xs:element" — не компилируется.
...
Рейтинг: 0 / 0
05.04.2012, 15:11
    #37740401
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
Про xsl забудьте, нужно писать программу.

Алгоритм примерно такой: берем корневой тег исходно xml со всеми его атрибутами, копируем в новый документ, валидируем схемой. Если есть ошибка, разбираемся в ее сути, исправляем, возможно подтягивая для этого данные из исходного документа, валидируем опять. Повторяем пока ошибка не исчезнет. Потом берем первого потомка и добавляем в этот новый документ, опять валидируем. И т.д. Может так случиться, что потомок оказался необходимым для валидации родителя на предыдущей итерации, такие варианты тоже нужно предусматривать.
...
Рейтинг: 0 / 0
05.04.2012, 15:16
    #37740419
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
Вообще задача интересная, я бы ее порешал, если бы было нечем заняться ))
...
Рейтинг: 0 / 0
05.04.2012, 15:17
    #37740420
Стас Агарков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
Antonariy,

мне не нужно валидировать. Нужно просто профильтровать исходный XML.
Например, такой XSD:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="country" type="country"/>
    <xs:complexType name="country">
        <xs:sequence>
            <xs:element name="title" type="xs:string">
                <xs:annotation>
                    <xs:appinfo>
                        <xs:element name="abc">true</xs:element>
                    </xs:appinfo>
                </xs:annotation>
            </xs:element>
            <xs:element name="population" type="xs:decimal"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>


Достать отсюда все xs:element, у которых вложенный xs:element с именем abc имеет значение true.
Все подходящие сюда элементы вывести в один список со строками такого вида:
Код: xml
1.
<xsl:template match="/country/title"/>


После этого XSLT такого вида
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="/country/title"/>
</xsl:stylesheet>


удалит лишнее.

Я иду в правильном направлении?
...
Рейтинг: 0 / 0
05.04.2012, 15:23
    #37740438
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
AntonariyЭто невозможно.Сильно не уверен. Основная проблема - это найти для произвольного элемента его описание в XSD. Для этого нужно для корневого элемента найти его определение с схеме, а потом просто перемещаться по схеме параллельно с перемещением по документу...

В конечном счете это выльется в обычный валидатор по схеме, но написанный на XSL. Что довольно круто

Так, что, пожалуй, задача решаема. Вопрос в трудозатратах.
...
Рейтинг: 0 / 0
05.04.2012, 15:32
    #37740466
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
Стас АгарковЕсли мне нужно вытянуть xs:element в xs:element, то какое выражение мне нужно написать в select?Это не так просто. Элемент может быть определен по ссылке и может быть вложен в произвольное число xsd:group и xsd:choice, которые, также могут быть определены по ссылке. О банальных xsd:sequence я молчу. Вторая засада - это именованные complexType. Если решить эти две проблемы, то все остальное просто.

Я пока молчу о нескольких XSD, но с этим тоже просто. Поэтому пока на это внимания обращать не стоит
...
Рейтинг: 0 / 0
05.04.2012, 15:35
    #37740478
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
Стас Агарковмне не нужно валидировать. А как вы узнаете, что результат фильтрации валиден? Конечная инстанция — xsd, а не ваше мнение, что правка сделала именно то, что надо.
Стас АгарковНапример, такой XSD:Это ерунда, а не пример. Элемент abc находится в секции комментариев и в валидации не участвует.
Стас АгарковЯ иду в правильном направлении?Вы идете в направлении частного случая.
...
Рейтинг: 0 / 0
05.04.2012, 15:39
    #37740487
Стас Агарков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
Antonariy,

именно в секции annotation он и должен/будет находиться. Там планируется хранить метаинформацию, на основании которой определять включать поле в результирующий XML или нет.
Всё таки я не очень понял насчет валидации... Фактически никто результат трансформации валидировать не будет. Задача в том, чтобы XML получить и всё.
...
Рейтинг: 0 / 0
05.04.2012, 15:40
    #37740489
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
_Vasilisk_Я пока молчу о нескольких XSD, но с этим тоже просто.Тогда я промолчу об extention/restriction ))
...
Рейтинг: 0 / 0
05.04.2012, 15:53
    #37740522
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
Стас АгарковAntonariy,

именно в секции annotation он и должен/будет находиться. Там планируется хранить метаинформацию, на основании которой определять включать поле в результирующий XML или нет.Каким-то неестественным образом вы xsd используете. Запись
Код: xml
1.
2.
3.
4.
        <xs:sequence>
            <xs:element name="title" type="xs:string">
            <xs:element name="population" type="xs:decimal"/>
        </xs:sequence>

уже определяет, что никакого abc в country быть не может.

Фактически никто результат трансформации валидировать не будет. Задача в том, чтобы XML получить и всё.Значит нет никаких гарантий, что результат будет правильным.
...
Рейтинг: 0 / 0
05.04.2012, 15:55
    #37740527
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
Двухфазное преобразование это хорошо (потом обе фазы можно будет слить в одну). Только из схемы нужно генерировать не XSL, а псевдо-документ, который является упрощенной схемой. Код где-то такой
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xsы="http://www.w3.org/2001/XMLSchema">

  <xsl:template match="xsd:schema">
    <schema>
      <xsl:apply-templates select="xsd:element" />
    </schema>
  </xsl:template>

  <xsl:template match="*[@ref]">
      <xsl:apply-templates select="/*[name() = name(current()) and @name = current()/@ref]" />
  </xsl:template>

  <xsl:template match="xsd:element">
    <xsl:element name="{name()}">
      <xsl:apply-templates select="/xsd:complexType[@name = current()/@type]" />
      <xsl:apply-templates select="*" />
    </xsl:element>
  </xsl:template>

  <xsl:template match="xsd:group | xsd:choice | xsd:sequence | xsd:complexType">
    <xsl:apply-templates select="*" />
  </xsl:template>

  <xsl:template match="xsd:annotation">
    <xsl:if test="....">
      <xsl:attribute name="store">true</xsl:attribute>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>
...
Рейтинг: 0 / 0
05.04.2012, 15:58
    #37740535
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
AntonariyТогда я промолчу об extention/restriction ))Да. С этим будет еще веселее
...
Рейтинг: 0 / 0
05.04.2012, 16:07
    #37740551
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML с помощью XSLT, используя XSD
_Vasilisk_AntonariyТогда я промолчу об extention/restriction ))Да. С этим будет еще веселееВот поэтому я предложил все это веселье переложить на стандартный xsd-валидатор, а собственные действия предпринимать на основании его диагноза.
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Преобразовать XML с помощью XSLT, используя XSD / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]