Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XML->XSLT таблицы / 8 сообщений из 8, страница 1 из 1
15.02.2011, 19:16
    #37118033
zver4ok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML->XSLT таблицы
Возникла проблема преобразования таблциц из XML в LaTeX. Конкретно загвоздка заключается в отделении одной таблицы от другой.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
  <Launch>
            Ввод в эксплуатацию
            <Debit>
                <CheckDate>
                     2010 - 03 - 01 
                </CheckDate>
                <DebG>
                     251 
                </DebG>
                ...
            </Debit>
        </Launch>
 <Break>
...
 </Break>
  <Launch>
            Ввод в эксплуатацию
            <Debit>
                <CheckDate>
                     2010 - 03 - 01 
                </CheckDate>
              ...
            </Debit>
   </Launch>

Преобразование

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<!-- ======= Table ====== -->
<xsl:template match="//Launch">
        <xsl:text>
\begin{center}
\begin{tabular}{cccc}
         <xsl:apply-templates select="//Debit"/>
</xsl:template>

<!-- ======= Debit ====== --> 
<xsl:template match="StatusInfo/Launch/Debit">
 <xsl:value-of select="CheckDate"/> 
 <xsl:text disable-output-escaping="yes"><![CDATA[ &  ]]></xsl:text>
 <xsl:value-of select="DebG"/> 
 <xsl:text disable-output-escaping="yes"><![CDATA[ &  ]]></xsl:text>
...
</xsl:template>

<xsl:template match="//Break">
     <xsl:text>
\end{tabular}
\end{center}
    </xsl:text>
</xsl:template>

В итоге таблицы начинают формироваться верно и нормально отображаются в LaTeX, но Debit, тоесть тело таблицы, встречается в документе два и более раз, а обрабатывается весь документ. Таким образом в первую таблицу помещается Debet относящийся к конкретному Launch и Debet, тот что будет только в след launch(таблице). Как отделить друг от друга содержание таблиц?
...
Рейтинг: 0 / 0
15.02.2011, 20:02
    #37118106
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML->XSLT таблицы
zver4ok,

Для начала, вместо
Код: plaintext
1.
2.
<xsl:template match="//Launch">
<xsl:template match="StatusInfo/Launch/Debit">
<xsl:template match="//Break">

напиши
Код: plaintext
1.
2.
<xsl:template match="Launch">
<xsl:template match="Debit">
<xsl:template match="Break">

Добавь
Код: plaintext
<xsl:template match="/">

И, если аккуратно напишешь <xsl:apply-templates> в полученых шаблонах, все должно получится.
...
Рейтинг: 0 / 0
15.02.2011, 20:53
    #37118203
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML->XSLT таблицы
zver4ok,

Еще раз глянул. Основная ошибка вот в чем:

вместо
Код: plaintext
<xsl:apply-templates select="//Debit"/>
надо
Код: plaintext
<xsl:apply-templates select=".//Debit"/>
...
Рейтинг: 0 / 0
15.02.2011, 21:10
    #37118226
zver4ok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML->XSLT таблицы
refreg,

Спасибо, решено. А то я в голове нагородил уже счетчиков и переменных.
...
Рейтинг: 0 / 0
15.02.2011, 21:37
    #37118271
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML->XSLT таблицы
zver4okrefreg,

Спасибо, решено. А то я в голове нагородил уже счетчиков и переменных.Если начинать с корневого каталога, и постепенно разворачиваться, (как я нарисовал выше), меньше ошибок будет.

Вот, например, если входящий Launch будет двигаться по ветке - то будет child-ом StatusInfo, то потомком StatusInfo2 - тогда темплейт StatusInfo/Launch/Debit будет срабатывать только для StatusInfo.

И еще, если формат XML не оговорен жестко, лучше бы закрывать тег сразу в шаблоне Launch - красивее и проще. А Break вообще тогда не нужен
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<xsl:template match="//Launch">
  <xsl:text>
  \begin{center}
  \begin{tabular}{cccc}
  </xsl:text>
         <xsl:apply-templates select=".//Debit"/>
  <xsl:text>
  \end{tabular}
  \end{center}
  </xsl:text>
</xsl:template>
...
Рейтинг: 0 / 0
16.02.2011, 18:26
    #37120790
zver4ok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML->XSLT таблицы
refreg,

Переделал, в соответствии с рекомендациями. Работает это как надо.
Но структура XML задана жестко и изменить нельзя.
break - это просто заметка о причине приостановки. Но Break потомок StatusInfo, на ряду с Launch. И как Debit обрабатывать будет не верно. Теперь таже проблема с break.
необходимо применить шаблон <xsl:apply-templates select="Break"/>
Если сделать это в StatusInfo, до либо после Launch, он так и выведется, в не зависимости от структуры.
Если вызвать в Launch <xsl:apply-templates select="//Break"/>, то break будет там где необходимо, но будет повторяться столько раз, сколько Break присутствует.

Снова пример XML

Код: plaintext
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.
  <Launch>
       Ввод в эксплуатацию
            <Debit>
                <CheckDate>
                     2010 - 03 - 01 
                </CheckDate>
                <DebG>
                     251 
                </DebG>
                ...
            </Debit>
        </Launch>
 <Break>
    <text>...</text>
 </Break>
  <Launch>
            Ввод в эксплуатацию
            <Debit>
                <CheckDate>
                     2010 - 03 - 02 
                </CheckDate>
              ...
            </Debit>
   </Launch>
 <Break>
    <text>...</text>
 </Break>
...

XSL:

Код: plaintext
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.
<xsl:apply-templates select="StatusInfo"/>

<!-- ======= StatusInfo ====== -->
<xsl:template match="StatusInfo">
...
	<xsl:apply-templates select="Launch"/> 
</xsl:template>  

<!-- ======= Launch ====== -->   
<xsl:template match="Launch">
...
  <xsl:apply-templates select=".//Debit"/>
        \end{tabular}
        \end{center}
 </xsl:template>

<!-- ======= Break ====== -->   
<xsl:template match="Break">     
           <xsl:apply-templates/> 
</xsl:template>

<!-- ======= Debit ====== -->           
<xsl:template match="Debit">            
          <xsl:value-of select="CheckDate"/> 
       ... 
</xsl:template>


Как необходимо правильно применить шаблон break, чтобы выводился соответствующий Break, после соотвествующего Launch
...
Рейтинг: 0 / 0
16.02.2011, 19:44
    #37120968
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML->XSLT таблицы
zver4ok,

Не понял, зачем нужен Break, ну да ладно - как то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:output method="text"/>
	<!-- -->
	<xsl:template match="/">
		<xsl:apply-templates select="StatusInfo//Launch | StatusInfo//Break"/>
	</xsl:template>
	<!-- ======= Table ====== -->
	<xsl:template match="//Launch">
		<xsl:text>&#xA;&#xA;\begin{center}&#xA;\begin{tabular}{cccc}</xsl:text>
		<xsl:apply-templates select=".//Debit"/>
		<xsl:text>&#xA;\end{tabular}&#xA;\end{center}</xsl:text>
	</xsl:template>
	<!-- ======= Debit ====== -->
	<xsl:template match="Debit">
		<xsl:value-of select="CheckDate"/>
	</xsl:template>
	<!-- -->
	<xsl:template match="Break">
		<xsl:value-of select="concat('&#xA;\Break',text())"/>
	</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
16.02.2011, 19:52
    #37120979
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML->XSLT таблицы
Это, разумеется, опечатка:
Код: plaintext
<xsl:template match="//Launch">
так надо:
Код: plaintext
<xsl:template match="Launch">
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XML->XSLT таблицы / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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