powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / вопрос по XSL
19 сообщений из 19, страница 1 из 1
вопрос по XSL
    #33457812
dasbot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Как с помощью XSL преобразования в исходном XML:
1. удалить ненужные атрибуты
Например есть XML in_xml:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<ROWSET>
 <ROW>
  <ID> 1 </ID>
  <NAME>aaa</NAME>
  <LASTNAME>aaabbb</LASTNAME>
 </ROW>
 <ROW>
  <ID> 2 </ID>
   <NAME>ccc</NAME>
   <LASTNAME>cccddd</LASTNAME>
   <BAD> 26267262 </BAD>
  </ROW>
</ROWSET>

Нужно такой XSL in_xsl, чтоб выходной XML out_xml не содержал тега <BAD>
Я сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="no"/>
<xsl:template match="/">
<ROWSET>
<xsl:for-each select="ROWSET/ROW">
<ROW>
  <ID><xsl:value-of select="ID"/></ID>
  <FIRSNAME><xsl:value-of select="NAME"/></NAME>
  <LASTNAME><xsl:value-of select="LASTNAME"/></LASTNAME>
</ROW>
</xsl:for-each>
</ROWSET>
</xsl:template>
</xsl:stylesheet>
- это правильно? или есть другие варианты

2. обрезать содержимое тега? Например вместо 9 символов - в выходном XML получить первые 5

<tag>123456789</tag> ----> <tag>12345</tag>

Заранее спасибо
...
Рейтинг: 0 / 0
вопрос по XSL
    #33457883
M0us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если работает - значит правильно, хотя я for-each не уважаю...
предпочитаю apply-templates

хотя как это может работать, когда название открывающего и закрывающего элемента разные?
Код: plaintext
1.
<FIRSNAME><xsl:value-of select="NAME"/></NAME>

<tag>123456789</tag> ----> <tag>12345</tag>
Код: plaintext
<xsl:value-of select="substring(tag, 1, 5)"/>
...
Рейтинг: 0 / 0
вопрос по XSL
    #33457961
dasbot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
M0usесли работает - значит правильно, хотя я for-each не уважаю...
предпочитаю apply-templates

хотя как это может работать, когда название открывающего и закрывающего элемента разные?
Код: plaintext
1.
<FIRSNAME><xsl:value-of select="NAME"/></NAME>


Ошибся, когда копировал


M0us
<tag>123456789</tag> ----> <tag>12345</tag>
Код: plaintext
<xsl:value-of select="substring(tag, 1, 5)"/>


Спасибо
...
Рейтинг: 0 / 0
вопрос по XSL
    #33458008
dasbot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
M0us хотя я for-each не уважаю...
предпочитаю apply-templates
Не подскажите, в чем разница?

И куда здесь вставить <ROWSET> ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="ROW">
<ROW>
  <ID><xsl:value-of select="ID"/></ID>
  <NAME><xsl:value-of select="NAME"/></NAME>
  <LASTNAME><xsl:value-of select="LASTNAME"/></LASTNAME>
</ROW>
</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
вопрос по XSL
    #33458065
Еретик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
There's more than one way to do it!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<ROWSET>
 <xsl:apply-templates/>
</ROWSET>
</xsl:template>

<xsl:template match="ROW">
<ROW>
<xsl:copy-of select="*[name() != 'BAD']"/>
</ROW>
</xsl:template>

</xsl:stylesheet>

...
Рейтинг: 0 / 0
вопрос по XSL
    #33458088
M0us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dasbot M0us хотя я for-each не уважаю...
предпочитаю apply-templates
Не подскажите, в чем разница?
в данном случае никакой, т.к. Вам нужно отобрать все записи.
for-each - делает полный перебор значений.
но иногда требуется выбрать определенный диапазон, например все с именем "aaa":
Код: plaintext
<xsl:apply-templates select="NAME='aaa'">
тогда apply-templates очень к месту.
...
Рейтинг: 0 / 0
вопрос по XSL
    #33458205
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
M0us dasbot M0us хотя я for-each не уважаю...
предпочитаю apply-templates
Не подскажите, в чем разница?
в данном случае никакой, т.к. Вам нужно отобрать все записи.
for-each - делает полный перебор значений.

Я бы не стал так категорично ограничивать функциональность for-each
M0us
но иногда требуется выбрать определенный диапазон, например все с именем "aaa":
Код: plaintext
<xsl:apply-templates select="NAME='aaa'">
тогда apply-templates очень к месту.
Тут замечательно сработает и такая байда:
Код: plaintext
1.
<xsl:for-each select="NAME='aaa'">
....
Другое дело, что XSLT - язык "декларативный" по сути своей (т.е. должен описывать в шаблонах - " что делать", а не - " как делать"), и использование в нем циклов for-each сродни использованию циклов while для изменения записей в строках таблицы при написании запросов на T-SQL (работать будет, и даже на небольшом количестве данных - неразличимо по скорости/ресурсам сервера, но... "неаккуратненько как-то").
...
Рейтинг: 0 / 0
вопрос по XSL
    #33458226
M0us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-quXSLT - язык "декларативный" по сути своей (т.е. должен описывать в шаблонах - "что делать", а не - "как делать"), и использование в нем циклов for-each сродни использованию циклов while для изменения записей в строках таблицы при написании запросов на T-SQL (работать будет, и даже на небольшом количестве данных - неразличимо по скорости/ресурсам сервера, но... "неаккуратненько как-то").
критика очень к месту. поддерживаю :)
...
Рейтинг: 0 / 0
вопрос по XSL
    #33458296
Еретик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
M0us qu-quXSLT - язык "декларативный" по сути своей (т.е. должен описывать в шаблонах - "что делать", а не - "как делать"), и использование в нем циклов for-each сродни использованию циклов while для изменения записей в строках таблицы при написании запросов на T-SQL (работать будет, и даже на небольшом количестве данных - неразличимо по скорости/ресурсам сервера, но... "неаккуратненько как-то").
критика очень к месту. поддерживаю :)

Да, XSL свой стиль мышления требует.
Мой вариант XSL в этом смысле вроде лучше смотрится... Или нет?

/topic/248299&hl=#2210283
...
Рейтинг: 0 / 0
вопрос по XSL
    #33458572
Еретик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dasbot
Как с помощью XSL преобразования в исходном XML:
1. удалить ненужные атрибуты
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
<ROWSET>
 <ROW>
  ...
 </ROW>
 <ROW>
  ...
  </ROW>
</ROWSET>


Только вопрос - а зачем здесь XSLT вообще? Этот XML получен с помощью xml-библиотек СУБД типа Oracle или MS SQL. Так эти библиотеки + SQL содержат все нужные функии, чтобы <BAD> не попал в ROWSET вообще, и даже чтобы вывести xml типа

Код: plaintext
1.
2.
3.
4.
5.
<ANYROOT>
<ANYNAME ID="1" NAME="aaa" LASTNAME="aaabbb"/>
....
</ANYROOT>

...
Рейтинг: 0 / 0
вопрос по XSL
    #33458970
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еретик...
Мой вариант XSL в этом смысле вроде лучше смотрится... Или нет?

/topic/248299&hl=#2210283

В смысле примера использования <xsl:apply-templates/> и <xsl:copy-of /> безусловно - лучше...
Только этот пример не очень адекватно (ИМХО) разъясняет суть "декларативности" XSLT, т.к. "привязан" жестко к структуре исходного документа, т.е. может обрабатывать только элементы ROW , и исключать только их ( ROW -s) дочерние элементы BAD (для примера, безусловно, достаточно).

Я вот тут взял на себя смелость - немного изменить структуру исходного документа, чтобы продемонстрировать более "общий" подход:
Код: plaintext
\n<ROWSET>\n   <ROW good="yes" bad="no">aa\n    <ID good="yes" bad="no"> 1 </ID>\n    <NAME good="yes" bad="no">aaa</NAME>\n    <LASTNAME good="yes" bad="no">aaabbb</LASTNAME>\n    bb\n   </ROW>\n   <ROW>bb\n    <ID badATTRIBUTE="must die!"> 2 </ID>\n    <NAME>bbb</NAME>\n    <LASTNAME>bbbccc</LASTNAME>\n    <BAD> 26267262 </BAD>\n    cc\n   </ROW>\n<badBLOCK>\n   <ROW>cc\n    <ID> 3 </ID>\n    <NAME>ccc</NAME>\n    <LASTNAME>cccddd</LASTNAME>\n    <BAD> 26267262 </BAD>\n    dd\n   </ROW>\n</badBLOCK>\n   <ROW>dd\n    <ID> 4 </ID>\n    <badNAME>ddd</badNAME>\n    <LASTNAME>dddeee</LASTNAME>\n    ee\n   </ROW>\n</ROWSET>\n
Например, как если бы кто-то захотел "выверить" исходный документ "ручками" и пометить ненужные блоки признаком "bad", чтобы потом преобразовать в новый документ уже без этих блоков.
Код: plaintext
<?xml version="1.0" encoding="UTF-8"?>\n<xsl:stylesheet version="1.0"\n   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">\n<!-- 1. говорим, что будем получать на "выходе" -->\n<xsl:output encoding="UTF-8" method="xml" indent="yes"/>\n\n<!-- 2. говорим, что "лишние" пробелы нам не нужны (пригодится в шаблоне п. 7) -->\n<xsl:strip-space elements="*"/>\n\n<!-- 3. говорим, что начиная от корня документа будем перебирать все, что попадется -->\n<xsl:template match="/">\n <xsl:apply-templates/>\n</xsl:template>\n\n<!-- 4. если встретится элемент, -->\n<xsl:template match="*">\n<!-- 4.1 ... сделаем такой же элемент -->\n  <xsl:element name="{name()}">\n<!-- 4.2 ... и продолжим обработку всех его "дочерних" элементов, \n                атрибутов и текстовых узлов \n                (нафига нам "лишние" комментарии и инструкции обработки?) -->\n     <xsl:apply-templates select="*|@*|text()"/>\n  </xsl:element>\n</xsl:template>\n\n<!-- 5. если встретится атрибут, -->\n<xsl:template match="@*">\n<!-- 5.1 ... сделаем такой же атрибут -->\n  <xsl:attribute name="{name()}">\n<!-- 5.2 ... с таким же значением  -->\n     <xsl:value-of select="."/>\n  </xsl:attribute>\n</xsl:template>\n\n<!-- 6. если встретится текстовый узел, -->\n<xsl:template match="text()">\n<!-- 6.1 ... сделаем такой же текстовый узел -->\n  <xsl:value-of select="."/>\n</xsl:template>\n\n<!-- 7. и наконец, если встретися элемент BAD\n        или узел/атрибут с именем,\n        начинающимся на " bad",\n        то ничего мы делать и не будем -->\n<xsl:template match="BAD|node()[starts-with(name(),\'bad\')]|@*[starts-with(name(),\'bad\')]"/>\n\n</xsl:stylesheet>\n
Таким шаблоном, по-моему, можно обработать не только конкретный документ, но и многие другие достаточно часто встречающиеся...
А "конкретика", имеющая смысл только для данного вида документов, находится всего в одной строчке самого "крайнего" шаблона, которую изменить при случае (вместо "bad" поставить, например, "exclude" или "skip") - плевое дело.
...
Рейтинг: 0 / 0
вопрос по XSL
    #33463093
Еретик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-qu
Только этот пример не очень адекватно (ИМХО) разъясняет суть "декларативности" XSLT, т.к. "привязан" жестко к структуре исходного документа....

....
Я вот тут взял на себя смелость - немного изменить структуру исходного документа, чтобы продемонстрировать более "общий" подход:

....

Таким шаблоном, по-моему, можно обработать не только конкретный документ,

Решение твое имеет смысл, но, на мой взгляд, лишь теоретический... На практике я бы так далеко не заглядывал.... Задача есть конкретная, и самое простое решение будет наилучшим.


А если концептуально - мы работаем с результатом выборки из SQL-базы данных, и задача у нас уровня "заплатки". Так, dasbot ?


В случае разработки я бы вообще решал ее не через XSLT, а на уровне порта SQL+XML (типа XML DB, SQLX или XSQL , и т.п. ).
...
Рейтинг: 0 / 0
вопрос по XSL
    #33463173
Еретик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еретик qu-qu
....


Решение твое имеет смысл, но, на мой взгляд, лишь теоретический...


В том числе, оно имеет учебно-познавательный смысл :)
Но для данного конекретного случая громоздко.
...
Рейтинг: 0 / 0
вопрос по XSL
    #33463222
M0us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕретикНо для данного конекретного случая громоздко.
оно громоздко только потому, что qu-qu пытался написать что-то универсальное. на самом деле очень к месту :)
...
Рейтинг: 0 / 0
вопрос по XSL
    #33463237
dasbot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еретик
А если концептуально - мы работаем с результатом выборки из SQL-базы данных, и задача у нас уровня "заплатки". Так, dasbot ?
Так точно

Еретик
В случае разработки я бы вообще решал ее не через XSLT, а на уровне порта SQL+XML (типа XML DB, SQLX или XSQL , и т.п. ).
В моем случае это не совсем удобно


Сам с xml знаком поверхностно, поэтому все вышеизложенное приму к сведению

Всем большое спасибо
...
Рейтинг: 0 / 0
вопрос по XSL
    #33464853
Еретик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dasbot Еретик
А если концептуально - мы работаем с результатом выборки из SQL-базы данных, и задача у нас уровня "заплатки". Так, dasbot ?
Так точно



А заплатка должна быть простой и крепкой! Поэтому, чем проще и надежнее, тем лучше, и разумеется во всякие тяжкие SQL/XML тебе лезть не надо.
...
Рейтинг: 0 / 0
вопрос по XSL
    #33465612
M0us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уважаемые qu-qu и Еретик.
Несколько Ваших последних сообщений в этом топике были удалены в связи с тем, что не относились к теме топика и несли раздражительный характер по отношению друг к другу.

p.s. Огромная просьба, в будущем выяснять отношения по электронной почте.
...
Рейтинг: 0 / 0
вопрос по XSL
    #33466016
Еретик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
M0usуважаемые qu-qu и Еретик.
Несколько Ваших последних сообщений в этом топике были удалены в связи с тем, что не относились к теме топика и несли раздражительный характер по отношению друг к другу.

p.s. Огромная просьба, в будущем выяснять отношения по электронной почте.

Да вроде мы друг друга не раздражали... Я, по крайней мере, не заметил неполиткорректности ни с чьей стороны, а также попыток выяснения личных отношений.

Я понимаю и уважаю позицию qu-qu - он дал превосходный пример XSLT , но я не считаю ее подходящим решением конкретной практической задачи....

Речь о разных принципиальных подходах к решению задач, ничего личного . Только по теме вопроса dashbot ...



PS. Да вроде все нужные посты на месте...
...
Рейтинг: 0 / 0
вопрос по XSL
    #33466044
Еретик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле человек, который спрашивал помощь, получил ответ и сказал всем спасибо. Так что тему вообще можно закрыть, а о подходах порассуждать где-то в другой отдельной теме, если есть желаение
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / вопрос по XSL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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