powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT трансформация, можно ли выполнить условное связывание 2-х XML-файлов?
10 сообщений из 10, страница 1 из 1
XSLT трансформация, можно ли выполнить условное связывание 2-х XML-файлов?
    #37791569
Guest_2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется 2 XML файла с некими данными связанными межу собой по ID:
файл-1
Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
<?xml version="1.0" encoding="WINDOWS-1251"?>
<PERS_LIST>
  <ZGLV>
    <VERSION>1.0</VERSION>
    <DATA>2011-12-30</DATA>
    <FILENAME>LM300024S30004_11061</FILENAME>
    <FILENAME1>HM300024S30004_11061</FILENAME1>
  </ZGLV>
  <PERS>
    <ID_PAC>1000078</ID_PAC>
    <FAM>Иванова</FAM>
    <IM>Александра</IM>
    <OT>Ивановна</OT>
    <W>2</W>
    <DR>1950-01-01</DR>
    <FAM_P/>
    <IM_P/>
    <OT_P/>
    <W_P/>
    <DR_P/>
    <MR/>
    <DOCTYPE/>
    <DOCSER>9999</DOCSER>
    <DOCNUM>999999</DOCNUM>
    <SNILS>011-222-777 00</SNILS>
    <OKATOG>12401000000</OKATOG>
    <OKATOP/>
    <COMENTP/>
  </PERS>
  <PERS>
    <ID_PAC>1000176</ID_PAC>
    <FAM>Петров</FAM>
    <IM>Иван</IM>
    <OT>Петрович</OT>
    <W>1</W>
    <DR>1951-02-03</DR>
    <FAM_P/>
    <IM_P/>
    <OT_P/>
    <W_P/>
    <DR_P/>
    <MR/>
    <DOCTYPE/>
    <DOCSER>9999</DOCSER>
    <DOCNUM>777777</DOCNUM>
    <SNILS>077-777-333 00</SNILS>
    <OKATOG>12401000000</OKATOG>
    <OKATOP/>
    <COMENTP/>
  </PERS>
</PERS_LIST>


файл 2
Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
<?xml version="1.0" encoding="WINDOWS-1251"?>
<ZL_LIST>
  <ZGLV>
    <VERSION>1.0</VERSION>
    <DATA>2011-12-30</DATA>
    <FILENAME>HM300024S30004_11061</FILENAME>
  </ZGLV>
  <SCHET>
    <CODE>20113</CODE>
    <CODE_MO>300024</CODE_MO>
    <YEAR>2011</YEAR>
    <MONTH>06</MONTH>
    <NSCHET>3</NSCHET>
    <DSCHET>2011-06-30</DSCHET>
    <PLAT>30004</PLAT>
    <SUMMAV>3444445.23</SUMMAV>
    <COMENTS/>
    <SUMMAP/>
    <SANK_MEK/>
    <SANK_MEE/>
    <SANK_EKMP/>
  </SCHET>
  <ZAP>
    <N_ZAP>1</N_ZAP>
    <PR_NOV>0</PR_NOV>
    <PACIENT>
      <ID_PAC>1000078</ID_PAC>
      <VPOLIS>1</VPOLIS>
      <SPOLIS>МАКС</SPOLIS>
      <NPOLIS>0999999</NPOLIS>
      <SMO>30004</SMO>
      <SMO_OGRN/>
      <SMO_OK/>
      <SMO_NAM/>
      <NOVOR>0</NOVOR>
    </PACIENT>
    <SLUCH>
      <IDCASE>305</IDCASE>
      <USL_OK>1</USL_OK>
      <VIDPOM>1</VIDPOM>
      <NPR_MO/>
      <EXTR>2</EXTR>
      <LPU>300024</LPU>
      <LPU_1>300024</LPU_1>
      <PODR>007</PODR>
      <PROFIL>112</PROFIL>
      <DET>0</DET>
      <NHISTORY>22222/</NHISTORY>
      <DATE_1>2011-06-07</DATE_1>
      <DATE_2>2011-06-09</DATE_2>
      <DS0/>
      <DS1>I21.0</DS1>
      <DS2/>
      <CODE_MES1>000A0H</CODE_MES1>
      <CODE_MES2/>
      <RSLT>105</RSLT>
      <ISHOD>104</ISHOD>
      <PRVS>1126</PRVS>
      <IDDOKT>022-222-222 22</IDDOKT>
      <OS_SLUCH/>
      <IDSP>5</IDSP>
      <ED_COL>2</ED_COL>
      <TARIF>551.4</TARIF>
      <SUMV>1102.8</SUMV>
      <OPLATA/>
      <SUMP/>
      <REFREASON/>
      <SANK_MEK/>
      <SANK_MEE/>
      <SANK_EKMP/>
      <USL>
        <IDSERV/>
        <LPU/>
        <LPU_1/>
        <PODR/>
        <PROFIL/>
        <DET/>
        <DATE_IN/>
        <DATE_OUT/>
        <DS/>
        <CODE_USL/>
        <KOL_USL/>
        <TARIF/>
        <SUMV_USL/>
        <PRVS/>
        <CODE_MD/>
        <COMENTU/>
      </USL>
      <COMENTSL>
        <COD_OPL>0</COD_OPL>
        <PODVID>A</PODVID>
        <COD_DUSL/>
        <CS>0</CS>
        <FORLPU/>
      </COMENTSL>
    </SLUCH>
  </ZAP>
  <ZAP>
    <N_ZAP>2</N_ZAP>
    <PR_NOV>0</PR_NOV>
    <PACIENT>
      <ID_PAC>1000176</ID_PAC>
      <VPOLIS>1</VPOLIS>
      <SPOLIS>МАКС</SPOLIS>
      <NPOLIS>0777777</NPOLIS>
      <SMO>30004</SMO>
      <SMO_OGRN/>
      <SMO_OK/>
      <SMO_NAM/>
      <NOVOR>0</NOVOR>
    </PACIENT>
    <SLUCH>
      <IDCASE>438</IDCASE>
      <USL_OK>1</USL_OK>
      <VIDPOM>1</VIDPOM>
      <NPR_MO/>
      <EXTR>2</EXTR>
      <LPU>300024</LPU>
      <LPU_1>300024</LPU_1>
      <PODR>008</PODR>
      <PROFIL>108</PROFIL>
      <DET>0</DET>
      <NHISTORY>33333/</NHISTORY>
      <DATE_1>2011-06-19</DATE_1>
      <DATE_2>2011-06-19</DATE_2>
      <DS0/>
      <DS1>N40</DS1>
      <DS2/>
      <CODE_MES1>000A0D</CODE_MES1>
      <CODE_MES2/>
      <RSLT>101</RSLT>
      <ISHOD>102</ISHOD>
      <PRVS>112603</PRVS>
      <IDDOKT>033-333-333 33</IDDOKT>
      <OS_SLUCH/>
      <IDSP>5</IDSP>
      <ED_COL>1</ED_COL>
      <TARIF>507</TARIF>
      <SUMV>507</SUMV>
      <OPLATA/>
      <SUMP/>
      <REFREASON/>
      <SANK_MEK/>
      <SANK_MEE/>
      <SANK_EKMP/>
      <USL>
        <IDSERV/>
        <LPU/>
        <LPU_1/>
        <PODR/>
        <PROFIL/>
        <DET/>
        <DATE_IN/>
        <DATE_OUT/>
        <DS/>
        <CODE_USL/>
        <KOL_USL/>
        <TARIF/>
        <SUMV_USL/>
        <PRVS/>
        <CODE_MD/>
        <COMENTU/>
      </USL>
      <COMENTSL>
        <COD_OPL>0</COD_OPL>
        <PODVID>A</PODVID>
        <COD_DUSL/>
        <CS>0</CS>
        <FORLPU/>
      </COMENTSL>
    </SLUCH>
  </ZAP>
</ZL_LIST>



Как уже говорил связь между данными по тегу <ID_PAC> .
На выходе XSLT трансформации я хотел получить строчки SQL скрипта вида:
Код: plsql
1.
2.
3.
4.
5.
6.
insert into R_PACIENT (ID_PAC, VPOLIS, SPOLIS, NPOLIS, SMO, SMO_OGRN, SMO_OK, SMO_NAM, NOVOR,
                       FAM, IM, OT, W, DR, FAM_P, IM_P, OT_P, W_P, DR_P, MR,
                       DOCTYPE, DOCSER, DOCNUM, SNILS, OKATOG, OKATOP, COMMENTP)
values (1000176, 1, "МАКС", "0777777", 30004, NULL, NULL, NULL, 0,
        "Петров", "Иван", "Петрович", 1, "1951-02-03", NULL, NULL, NULL, NULL, NULL, NULL,
        NULL, "9999", "777777", "077-777-333 00", "12401000000", NULL, NULL);


Первая строчка в values - взята из второго файла, а начиная с FAM - данный взяты из первого...
(для простых случаев когда 1 файл на входе 1 на выходе проблем не составляет, а когда данные разбросаны по 2-м XML-файлам я немного растерялся.)

ВОПРОС: Возможно ли написать подобный XSLT-шаблон? Или придется писать программный парсер через запросы к двум XML-файлам?
...
Рейтинг: 0 / 0
XSLT трансформация, можно ли выполнить условное связывание 2-х XML-файлов?
    #37791589
Guest_2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В качестве простого примера приложу 2 файла: XML и шаблон для его трансформации в SQL-скрипт:
...
Рейтинг: 0 / 0
XSLT трансформация, можно ли выполнить условное связывание 2-х XML-файлов?
    #37791598
Guest_2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Файл почему то не приложился, ладно, тогда просто вставлю как текст:
XML-файл:

Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
<?xml version="1.0" encoding="WINDOWS-1251"?>
<root>
<rec RMPNAME="Выписан" IDRMP="101" DL_USLOV="1" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Переведён в др. ЛПУ" IDRMP="102" DL_USLOV="1" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Переведён в дневной стационар" IDRMP="103" DL_USLOV="1" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Переведён на другой профиль коек" IDRMP="104" DL_USLOV="1" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Умер" IDRMP="105" DL_USLOV="1" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Умер в приёмном покое" IDRMP="106" DL_USLOV="1" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Выписан" IDRMP="201" DL_USLOV="2" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Переведён в др. ЛПУ" IDRMP="202" DL_USLOV="2" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Переведён в стационар" IDRMP="203" DL_USLOV="2" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Переведён на другой профиль коек" IDRMP="204" DL_USLOV="2" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Умер" IDRMP="205" DL_USLOV="2" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Умер в приёмном покое" IDRMP="206" DL_USLOV="2" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Лечение завершено" IDRMP="301" DL_USLOV="3" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Лечение прервано по инициативе пациента" IDRMP="302" DL_USLOV="3" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Лечение прервано по инициативе ЛПУ" IDRMP="303" DL_USLOV="3" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Лечение продолжено" IDRMP="304" DL_USLOV="3" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Направлен на госпитализацию" IDRMP="305" DL_USLOV="3" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Направлен в дневной стационар" IDRMP="306" DL_USLOV="3" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Направлен в стационар на дому" IDRMP="307" DL_USLOV="3" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Направлен на консультацию" IDRMP="308" DL_USLOV="3" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Направлен на консультацию в другое ЛПУ" IDRMP="309" DL_USLOV="3" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Направлен в реабилитационное отделение" IDRMP="310" DL_USLOV="3" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Направлен на санаторно-курортное лечение" IDRMP="311" DL_USLOV="3" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Проведена дополнительная диспансеризация" IDRMP="312" DL_USLOV="3" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Констатация факта смерти" IDRMP="313" DL_USLOV="3" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Оказана помощь, больной оставлен на месте" IDRMP="401" DL_USLOV="4" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Доставлен в травмпункт" IDRMP="402" DL_USLOV="4" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Госпитализирован" IDRMP="403" DL_USLOV="4" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Передан бригаде интенсивной терапии" IDRMP="404" DL_USLOV="4" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Смерть в присутствии бригады СМП" IDRMP="405" DL_USLOV="4" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Смерть в автомобиле СМП" IDRMP="406" DL_USLOV="4" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Больной не найден на месте" IDRMP="407" DL_USLOV="4" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Отказ от помощи" IDRMP="408" DL_USLOV="4" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Адрес не найден" IDRMP="409" DL_USLOV="4" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Ложный вызов" IDRMP="410" DL_USLOV="4" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Смерть до приезда бригады СМП" IDRMP="411" DL_USLOV="4" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Больной увезён до прибытия СМП" IDRMP="412" DL_USLOV="4" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Больной обслужен врачом поликлиники до приб. СМП" IDRMP="413" DL_USLOV="4" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Вызов отменён" IDRMP="414" DL_USLOV="4" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Пациент практически здоров" IDRMP="415" DL_USLOV="4" DATEEND="0" DATEBEG="01.01.2011"/>
<rec RMPNAME="Дежурство" IDRMP="416" DL_USLOV="4" DATEEND="0" DATEBEG="01.01.2011"/>
</root>



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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
  <xsl:output method="text"/>

  <xsl:template match="root/*">
    <xsl:text>insert into S_RESULT (ID, NAME, DL_USL, DT_BEGIN, DT_END) values (</xsl:text>
    <xsl:value-of select="@IDRMP"/>
    <xsl:text>, "</xsl:text>
    <xsl:value-of select="@RMPNAME"/>
    <xsl:text>", </xsl:text>
    <xsl:value-of select="@DL_USLOV"/>
    <xsl:text>, </xsl:text>
    
    <xsl:choose> 
      <xsl:when test='@DATEBEG=""'> 
         <xsl:text>NULL</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>"</xsl:text>
        <xsl:value-of select="@DATEBEG"/>
        <xsl:text>"</xsl:text>
      </xsl:otherwise>
    </xsl:choose>

    <xsl:text>, </xsl:text>

    <xsl:choose> 
      <xsl:when test='@DATEEND=""'> 
         <xsl:text>NULL</xsl:text>
      </xsl:when>
      <xsl:when test='@DATEEND="0"'> 
         <xsl:text>NULL</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>"</xsl:text>
        <xsl:value-of select="@DATEEND"/>
        <xsl:text>"</xsl:text>
      </xsl:otherwise>
    </xsl:choose>

    <xsl:text>);</xsl:text>
    <xsl:text>
</xsl:text>
  </xsl:template>


</xsl:stylesheet>



На выходе получаем SQL-скрипт.
...
Рейтинг: 0 / 0
XSLT трансформация, можно ли выполнить условное связывание 2-х XML-файлов?
    #37792489
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guest_2012Возможно ли написать подобный XSLT-шаблон?RTFM document() function
...
Рейтинг: 0 / 0
XSLT трансформация, можно ли выполнить условное связывание 2-х XML-файлов?
    #37792641
Guest_2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понятно, что проще всего отослать на 4 буквы (читать мануал), но идей все равно нет:
Трансформация у DOMDocument -a (упрощенно) производится так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
var
  xmlSource: DOMDocument60;   //XML - файл
  xmlStylesheet: DOMDocument60;  //XSL - шаблон
  memSQL: TMemo;       //Мемо с SQL скриптом            
begin
  xmlSource.load(FNameXML);
  xmlStylesheet.load(FNameXSL);
  memSQL.Text := xmlSource.transformNode(xmlStylesheet);  //производим трансформацию
end;



И как тут засунуть еще 1 XML идей не возникает...
...
Рейтинг: 0 / 0
XSLT трансформация, можно ли выполнить условное связывание 2-х XML-файлов?
    #37792705
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guest_2012проще всего отослать на 4 буквы (читать мануалКонечно проще. Тем более, что если бы Вы соизволили почитать тот конкретный раздел документации, о котором я Вам написал, то Ваш вопрос решился бы сам собой
...
Рейтинг: 0 / 0
XSLT трансформация, можно ли выполнить условное связывание 2-х XML-файлов?
    #37792992
Guest_2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

Спасибо за "помощь", пошел писать свой парсер...
ЗЫ: (К слову я пользовался поиском, и читал мануалы, но конкретных решений свой проблемы не нашел, еслибы нашел, не просил бы помощи... А Вы продолжайте в том же духе, успехов...)
...
Рейтинг: 0 / 0
XSLT трансформация, можно ли выполнить условное связывание 2-х XML-файлов?
    #37793040
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тынц
Читать до тех пор, пока конкретность решения не станет очевидной.
...
Рейтинг: 0 / 0
XSLT трансформация, можно ли выполнить условное связывание 2-х XML-файлов?
    #37793072
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guest_2012пошел писать свой парсер...Удачи. Только маленькая просьба - не прибегайте сюда с вопросом "как написать свой парсер"
Guest_2012пользовался поиском, и читал мануалы, но конкретных решений свой проблемы не нашел Неужели?
Guest_2012еслибы нашел, не просил бы помощи...Не правильная формулировка. Правильная такая: "Если бы я попробовал поискать, то не просил бы помощи"
Guest_2012А Вы продолжайте в том же духе,Обязательно
...
Рейтинг: 0 / 0
XSLT трансформация, можно ли выполнить условное связывание 2-х XML-файлов?
    #37793381
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guest_2012...
И как тут засунуть еще 1 XML идей не возникает...
почему надо читать именно из файла?
читайте файл отдельно, склеивайте 2 документа под новым рутом, вуаля...

Если вы камикадзе склеиваете как строки, если нет, разбирайтесь с методами DOM.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT трансформация, можно ли выполнить условное связывание 2-х XML-файлов?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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