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

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

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

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

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

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

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

Алгоритм примерно такой: берем корневой тег исходно xml со всеми его атрибутами, копируем в новый документ, валидируем схемой. Если есть ошибка, разбираемся в ее сути, исправляем, возможно подтягивая для этого данные из исходного документа, валидируем опять. Повторяем пока ошибка не исчезнет. Потом берем первого потомка и добавляем в этот новый документ, опять валидируем. И т.д. Может так случиться, что потомок оказался необходимым для валидации родителя на предыдущей итерации, такие варианты тоже нужно предусматривать.
...
Рейтинг: 0 / 0
Преобразовать XML с помощью XSLT, используя XSD
    #37740419
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще задача интересная, я бы ее порешал, если бы было нечем заняться ))
...
Рейтинг: 0 / 0
Преобразовать XML с помощью XSLT, используя XSD
    #37740420
Стас Агарков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Преобразовать XML с помощью XSLT, используя XSD
    #37740438
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЭто невозможно.Сильно не уверен. Основная проблема - это найти для произвольного элемента его описание в XSD. Для этого нужно для корневого элемента найти его определение с схеме, а потом просто перемещаться по схеме параллельно с перемещением по документу...

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

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

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

именно в секции annotation он и должен/будет находиться. Там планируется хранить метаинформацию, на основании которой определять включать поле в результирующий XML или нет.
Всё таки я не очень понял насчет валидации... Фактически никто результат трансформации валидировать не будет. Задача в том, чтобы XML получить и всё.
...
Рейтинг: 0 / 0
Преобразовать XML с помощью XSLT, используя XSD
    #37740489
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Я пока молчу о нескольких XSD, но с этим тоже просто.Тогда я промолчу об extention/restriction ))
...
Рейтинг: 0 / 0
Преобразовать XML с помощью XSLT, используя XSD
    #37740522
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стас Агарков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
Преобразовать XML с помощью XSLT, используя XSD
    #37740527
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двухфазное преобразование это хорошо (потом обе фазы можно будет слить в одну). Только из схемы нужно генерировать не 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
Преобразовать XML с помощью XSLT, используя XSD
    #37740535
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyТогда я промолчу об extention/restriction ))Да. С этим будет еще веселее
...
Рейтинг: 0 / 0
Преобразовать XML с помощью XSLT, используя XSD
    #37740551
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_AntonariyТогда я промолчу об extention/restriction ))Да. С этим будет еще веселееВот поэтому я предложил все это веселье переложить на стандартный xsd-валидатор, а собственные действия предпринимать на основании его диагноза.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Преобразовать XML с помощью XSLT, используя XSD
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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