Преобразование нашего исходного документа к стандартной структуре: 01<xsl:stylesheet version="1.0"
02 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
03 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
04 xmlns:parus="parus.xslt"
05 xmlns:vbs="parus.vbscript"
06 exclude-result-prefixes="xsl msxsl parus vbs">
07<!-- Пространства имен:
08 xsl - стандартное пространство имен элементов xslt
09 msxsl - расширение Microsoft пространства имен xslt
10 parus - "наше" пространство имен. Принадлежащие ему идентификаторы описаны ниже.
11 vbs - "локальное" пространство имен, через которое мы будем получать доступ к скриптовым функциям. -->
12
13<!-- нам понадобятся возможнсти, которые не предоставляются стандартными средствами xslt-транслятора.
14Напрмер, нам будет нужна текущая дата. Определелим в локальном пространстве имен скриптовую функцию,
15возвращающую отформатированную дату -->
16 <msxsl:script language="VBScript" implements-prefix="vbs">
17 <![CDATA[
18 function today()
19 today = Year(Date) & "-" & Month(Date) & "-" & Day(Date)
20 end function
21 ]]>
22 </msxsl:script>
23
24 <xsl:output encoding="UTF-8"
25 method="xml"/>
26
27 <!-- шаблон корневого узла. Он будет применен один и только один раз. -->
28 <xsl:template match="/">
29 <!-- Элемент целевой структуры -->
30 <REPORTS>
31
32 <!-- Для каждого элемента "report" исходной структуры ... -->
33 <xsl:for-each select="data/report">
34 <REPORT>
35 <!-- выводим сообщение пользователю. Он увидит его протоколе загрузки -->
36 <xsl:value-of select="parus:Message(concat('Сообщение пользователю при загрузке файла ', parus:FileName(), '.'))"/>
37
38 <!-- выводим сообщение в отладочный монитор. -->
39 <xsl:value-of select="parus:DebugString('Сообщение в монитор.')"/>
40
41 <!-- эти элементы бререм из атрибутов узла "report" -->
42 <AGENT><xsl:value-of select="@agent"/></AGENT>
43 <FORM><xsl:value-of select="@form"/></FORM>
44
45 <!-- Формируем дату как результат вызова скриптовой функции -->
46 <BDATE><xsl:value-of select="vbs:today()" /></BDATE>
47
48 <!-- константа -->
49 <KIND>0</KIND>
50
51 <SUBREPORTS>
52 <!-- цикл по элементам "subreport" -->
53 <xsl:for-each select="subreport">
54 <SUBREPORT>
55
56 <!-- если "subreport" имеет атрибут "code", то использовать его -->
57 <xsl:if test="@code">
58 <CODE><xsl:value-of select="@code"/></CODE>
59 </xsl:if>
60
61 <VALUES>
62 <!-- цикл по всем атрибутам элемента "subreport" -->
63 <xsl:for-each select="@*">
64 <!-- если атрибут имеет имя, отличное от "code", то это показатель -->
65 <xsl:if test="not(name(.)='code')">
66 <VALUE>
67 <CODE><xsl:value-of select="name(.)"/></CODE>
68 <SVAL><xsl:value-of select="." /></SVAL>
69 </VALUE>
70 </xsl:if>
71 </xsl:for-each>
72 </VALUES>
73 </SUBREPORT>
74 </xsl:for-each>
75 </SUBREPORTS>
76 </REPORT>
77 </xsl:for-each>
78 </REPORTS>
79 </xsl:template>
80</xsl:stylesheet>
В результате применения этого преобразования к нашему документу мы получим следующий документ: 01<REPORTS>
02 <REPORT>
03 <AGENT>РосПищеСвет</AGENT>
04 <FORM>Форма 160.285</FORM>
05 <BDATE>2015-10-15</BDATE>
06 <KIND>0</KIND>
07 <SUBREPORTS>
08 <SUBREPORT>
09 <VALUES>
10 <VALUE>
11 <CODE>ЗаСпички</CODE>
12 <SVAL>100</SVAL>
13 </VALUE>
14 <VALUE>
15 <CODE>ЗаМыло</CODE>
16 <SVAL>200</SVAL>
17 </VALUE>
18 <VALUE>
19 <CODE>Качество</CODE>
20 <SVAL>Хорошее</SVAL>
21 </VALUE>
22 </VALUES>
23 </SUBREPORT>
24 <SUBREPORT>
25 <CODE>Разрез 1</CODE>
26 <VALUES>
27 <VALUE>
28 <CODE>ЗаСпички</CODE>
29 <SVAL>10</SVAL>
30 </VALUE>
31 <VALUE>
32 <CODE>ЗаМыло</CODE>
33 <SVAL>20</SVAL>
34 </VALUE>
35 <VALUE>
36 <CODE>Качество</CODE>
37 <SVAL>Среднее</SVAL>
38 </VALUE>
39 </VALUES>
40 </SUBREPORT>
41 <SUBREPORT>
42 <CODE>Разрез 2</CODE>
43 <VALUES>
44 <VALUE>
45 <CODE>ЗаСпички</CODE>
46 <SVAL>80</SVAL>
47 </VALUE>
48 <VALUE>
49 <CODE>ЗаМыло</CODE>
50 <SVAL>280</SVAL>
51 </VALUE>
52 <VALUE>
53 <CODE>Качество</CODE>
54 <SVAL>Отличное</SVAL>
55 </VALUE>
56 </VALUES>
57 </SUBREPORT>
58 </SUBREPORTS>
59 </REPORT>
60</REPORTS>
Этот документ вполне соответствует стандартной структуре, и, если в БД существуют соответствующая форма, контрагент, показатели и разрезы, то он загрузится. |