Форум программистов, компьютерный форум, киберфорум
Наши страницы
XML/XSL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
darkmayers
0 / 0 / 0
Регистрация: 02.02.2015
Сообщений: 3
1

Как обновить данные в файле xml на основе другого xml?

21.06.2015, 21:15. Просмотров 913. Ответов 1
Метки нет (Все метки)

Добрый день!

Мне необходимо разработать XSLT преобразование, которое будет обновлять данные в файле formats.xml (узлы name, shortName, type, knd, version) в соответствии с данными в файле classification.xml. При этом в качестве входного файла для преобразования пусть выступает файл formats.xml, а файл classification.xml пусть подгружается с помощью функции document().
Пытался реализовать это через choose, но не получается - зацикливается и копирует все без остановки.
Делаю так:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<xsl:template name="format">
    <xsl:for-each select="format">
      <xsl:call-template name="replace" />
    </xsl:for-each>
  </xsl:template>
  
  <xsl:template name="replace" match="/formats/format">
      <xsl:param name="name" />
  <xsl:choose>
    <xsl:when test="name!=document('classification.xml')/classification/group/format/@name">
      <xsl:copy-of select="../format" />
    </xsl:when>
  </xsl:choose>
  </xsl:template>
Может быть я вообще не так делаю?
Подскажите, как лучше всего реализовать такую функцию?
Вот отрывки из файлов.

Файл formats:

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
<formats>
<format gfv="105702" fileName="new_105702_4.00001">
    <name>2-НДФЛ</name>
    <shortName>2 НДФЛ</shortName>
    <periodBegin>01.01.2006</periodBegin>
    <periodEnd>31.12.2009</periodEnd>
    <type>1</type>
    <knd>1151078</knd>
    <version>4.00001</version>
    <isStoredInDataTree>true</isStoredInDataTree>
    <isCheckedByDom>false</isCheckedByDom>
    <orgTypes>1111</orgTypes>
  </format>
  <format gfv="101508" fileName="new_1151020_5.05">
    <name>Налоговая декларация по налогу на доходы физических лиц (форма 3-НДФЛ)</name>
    <shortName>3-НДФЛ</shortName>
    <periodBegin>01.01.2009</periodBegin>
    <periodEnd>31.12.2009</periodEnd>
    <type>1</type>
    <knd>1151020</knd>
    <version>5.05</version>
    <isStoredInDataTree>false</isStoredInDataTree>
    <isCheckedByDom>false</isCheckedByDom>
    <orgTypes>1111</orgTypes>
  </format>
</formats>
И файл classification:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<classification xmlns:fp="format-properties">
  <group id="1" name="Налоговая отчетность">
    <format id="1" fp:КНД="1110005" shortName="Сбор за пользование объектами водных биологических ресурсов" name="Сведения о полученной лицензии на пользование объектами водных биологических ресурсов, суммах сбора за пользование объектами водных биологических ресурсов, подлежащих уплате в виде разового и регулярных взносов" periods="1" form-modifiers="1">
      <variant id="1" fp:ВерФОтч="3.00000" contentType="Plain866" fp:ТипИнф="ОТЧЕТНОСТЬНП" />
    </format>
    <format id="2" fp:КНД="1110006" shortName="Сбор за пользование объектами животного мира" name="Сведения о полученной лицензии (разрешении) на пользование объектами животного мира, суммах сбора за пользование объектами животного мира, подлежащих уплате, и суммах фактического сбора" periods="1" form-modifiers="1">
      <variant id="1" fp:ВерФОтч="3.00000" contentType="Plain866" fp:ТипИнф="ОТЧЕТНОСТЬНП" />
    </format>
    <format id="3" fp:КНД="1110011" shortName="Сбор за пользование объектами водных биологических ресурсов" name="Сведения о полученных лицензиях (разрешениях) на пользование объектами водных биологических ресурсов, суммах сбора за пользование объектами водных биологических ресурсов, подлежащих уплате в виде разового и регулярных взносов"  periods="1" form-modifiers="1">
      <variant id="1" fp:ВерФОтч="3.00001" contentType="Plain866" fp:ТипИнф="ОТЧЕТНОСТЬНП" />
    </format>
    <format id="4" fp:КНД="1110012" shortName="Сбор за пользование объектами животного мира" name="Сведения о полученных лицензиях (разрешениях) на пользование объектами животного мира, суммах сбора за пользование объектами животного мира, подлежащих уплате, и суммах фактически уплаченного сбора" periods="1" form-modifiers="1">
      <variant id="1" fp:ВерФОтч="3.00001" contentType="Plain866" fp:ТипИнф="ОТЧЕТНОСТЬНП" />
    </format>
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2015, 21:15
Ответы с готовыми решениями:

В xml файле поменять данные
Добрый день! подскажите можно ли в эксемель файле как то автоматически поменять...

В HTML файле отображать данные из XML файла
Подскажите, как сделать, чтобы в HTML файле отображались данные из XML файла,...

Подскажите, как извлечь данные из XML
В VBScript использую поиск подстроки для звлечения даных из XML. Set xml =...

Обработка структуры и содержимого текста отличного от XML средствами XML
Есть текст, в котором есть структура и ключевые символы придуманные...

Проверка XML с XSD которой ссылается на другой XML файл
Допустим есть готовая структура с данными (xml1.xml) &lt;packet&gt; &lt;zap&gt; ...

1
diadiavova
3993 / 1406 / 435
Регистрация: 11.04.2015
Сообщений: 2,620
Записей в блоге: 35
22.06.2015, 13:46 2
Лучший ответ Сообщение было отмечено darkmayers как решение

Решение

darkmayers, а как определить, какой формат второго файла какому формату первого соответствует?

Добавлено через 18 минут
Очень примерно набросал, в каком направлении надо двигаться. Там все, что в квадратных скобках, надо записать иначе, в зависимости от того, откуда и по какому признаку извлекаются обновленные данные. Ты об этом ничего не написал, так что получай неполный пример. )))
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
 
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
 
  <xsl:template match="name | shortName | type | knd | version">
    <xsl:copy>
      <xsl:value-of select="document('classification.xml')//format[@name = 'Здесь имя, по которому надо идентифицировать элемент']/@*[name() = 'здесь определяем имя атрибута, занчение которого надо вставить в этом месте.']"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2015, 13:46

Поиск в XML файле
Дан файл xml, в нём &quot;база данных пользователей&quot;, нужно при помощи javasript...

XML тэги в svg файле
Здравствуйте уважаемые посетители форума. Нужна Ваша помощь. Есть SVG файл в...

Ограничени длинны строки в файле XML
Доброго времени суток! не знаю сюда или не сюда писать. Первый раз столкнулся с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru