Доступ к формируемому дереву в XSL
От: AliBaba  
Дата: 23.01.02 23:38
Оценка:
Привет, у меня такая проблема: есть таблица вида

<TABLE>

<TR><TD colspan="2">Header1</TD></TR>
<TR><TD>Item11</TD><TD>Item12</TD></TR>

<TR><TD colspan="2">Header2</TD></TR>
<TR><TD>Item21</TD><TD>Item22</TD></TR>

</TABLE>

и мне нужно получить из нее

<Header1>
<Item11/><Item12/>
</Header1>

<Header2>
<Item21/><Item22/>
</Header2>

Есть идея — при формировании выходного дерева искать (в XSL) последний таг типа Header и добавлять в него элементы типа Item. Дело за малым — написать XSL :)
Идея выглядит дико. В XML я темен. Может кто подскажет решение с высоты своего опыта?
Re: Доступ к формируемому дереву в XSL
От: Ort США  
Дата: 24.01.02 08:19
Оценка:
Я ничего не понял.

AB>Есть идея — при формировании выходного дерева

О каком дереве идет речь? В каком формате?

>искать (в XSL) последний таг типа Header и добавлять в него элементы типа Item. Дело >за малым — написать XSL


Вы привели кусочек HTML кода и XML.
Поэтому, что значит "искать в XSL"?

Что необходимо, из HTML сформировать XML+XSL?
Лично я пока с такой задачей не сталкивался, но в любом случае поясните более подробно вашу задачу.
"По мне, уж лучше пей, да дело разумей"
Re: Доступ к формируемому дереву в XSL
От: Аноним  
Дата: 24.01.02 12:08
Оценка:
Здравствуйте AliBaba, Вы писали:

AB>Привет, у меня такая проблема: есть таблица вида


AB><TABLE>


AB><TR><TD colspan="2">Header1</TD></TR>

AB><TR><TD>Item11</TD><TD>Item12</TD></TR>

AB><TR><TD colspan="2">Header2</TD></TR>

AB><TR><TD>Item21</TD><TD>Item22</TD></TR>

AB></TABLE>


AB>и мне нужно получить из нее


AB><Header1>

AB> <Item11/><Item12/>
AB></Header1>

AB><Header2>

AB> <Item21/><Item22/>
AB></Header2>

AB>Есть идея — при формировании выходного дерева искать (в XSL) последний таг типа Header и добавлять в него элементы типа Item. Дело за малым — написать XSL :)

AB>Идея выглядит дико. В XML я темен. Может кто подскажет решение с высоты своего опыта?

Например так:


<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="TABLE">
        <root>
            <xsl:apply-templates/>
        </root>
    </xsl:template>
    <xsl:template match="TR[position() mod 2 =1]">
        <xsl:element name="{./TD}">
            <xsl:apply-templates select="following-sibling::node()[position()=1]/TD"/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="TR"/>
    <xsl:template match="TD">
        <xsl:element name="{.}"/>
    </xsl:template>
</xsl:stylesheet>
Re: Уточняю
От: AliBaba  
Дата: 24.01.02 16:48
Оценка:
Ort'у (от 24.01.02): накладывая на мой html (он же xml) шаблоны xslt, я формирую выходное xml-дерево, которое должно выглядеть как то, что мне надо получить (см. вопрос). Так вот я хочу получить доступ к еще не дописанному выходному дереву — найти последний добавленный элемент Header и добавить в него свеженайденный Item. Можно?

Анониму (от 24.01.02): на самом деле задача чуть сложнее:

<TABLE>
<TR><TD colSpan="2">Header1</TD></TR>
<TR><TD>Item11</TD><TD>Item11_</TD></TR>
<TR><TD>Item12</TD><TD>Item12_</TD></TR>
<TR><TD>Item13</TD><TD>Item13_</TD></TR>
...............
<TR><TD>Item1N</TD><TD>Item1N_</TD></TR>

<TR><TD colSpan="2">Header2</TD></TR>
<TR><TD>Item21</TD><TD>Item21_</TD></TR>
<TR><TD>Item22</TD><TD>Item22_</TD></TR>
...............
</TABLE>
Re[2]: Уточняю
От: Аноним  
Дата: 24.01.02 17:50
Оценка:
Здравствуйте AliBaba, Вы писали:

AB>Ort'у (от 24.01.02): накладывая на мой html (он же xml) шаблоны xslt, я формирую выходное xml-дерево, которое должно выглядеть как то, что мне надо получить (см. вопрос). Так вот я хочу получить доступ к еще не дописанному выходному дереву — найти последний добавленный элемент Header и добавить в него свеженайденный Item. Можно?


AB>Анониму (от 24.01.02): на самом деле задача чуть сложнее:


AB><TABLE>

AB><TR><TD colSpan="2">Header1</TD></TR>
AB><TR><TD>Item11</TD><TD>Item11_</TD></TR>
AB><TR><TD>Item12</TD><TD>Item12_</TD></TR>
AB><TR><TD>Item13</TD><TD>Item13_</TD></TR>
AB>...............
AB><TR><TD>Item1N</TD><TD>Item1N_</TD></TR>

AB><TR><TD colSpan="2">Header2</TD></TR>

AB><TR><TD>Item21</TD><TD>Item21_</TD></TR>
AB><TR><TD>Item22</TD><TD>Item22_</TD></TR>
AB>...............
AB></TABLE>

Ответ на первый вопрос скоре всего отрицательный (по крайней мере так в лоб, как ты это описал, скорее всего это не делается).

По поводу второго замечания:
Сформулийруй, по какому признаку мы можем решить, что является Header'ом , а что Item'ом? Только ли по тексту или есть еще какие-нить признаки, например colspan?
Re[3]: Уточняю
От: AliBaba  
Дата: 24.01.02 19:17
Оценка:
Здравствуйте Аноним, Вы писали:

А>По поводу второго замечания:

А>Сформулийруй, по какому признаку мы можем решить, что является Header'ом , а что Item'ом? Только ли по тексту или есть еще какие-нить признаки, например colspan?

Думаю, что colSpan'а достаточно.
Re[3]: Прогресс
От: AliBaba  
Дата: 25.01.02 14:53
Оценка:
А>Ответ на первый вопрос скоре всего отрицательный (по крайней мере так в лоб, как ты это описал, скорее всего это не делается).

Ну ясно. Я сделал две xsl'ки, одна создает дерево вида

<header name="Header1"/>
<item name="Item11" header="Header1"/>
<item name="Item11_" header="Header1"/>
<item name="Item12" header="Header1"/>
...
<header name="Header2"/>
<item name="Item21" header="Header1"/>
<item name="Item21_" header="Header1"/>
<item name="Item22" header="Header1"/>
...

а вторая должна делать остальное.
Но появилась проблема, точнее я не знаю, как сделать. Код вида

<xsl:template match="header">
  <xsl:for-each select="(following-sibling::item)[following-sibling::item/@header=@name]">
    ...
  </xsl:for-each>
</xsl:template>

не находит нужные item'ы. Очевидно, я неправильно написал select. А как правильно?
Re[4]: Прогресс
От: Аноним  
Дата: 25.01.02 15:44
Оценка:
Здравствуйте AliBaba, Вы писали:

А>>Ответ на первый вопрос скоре всего отрицательный (по крайней мере так в лоб, как ты это описал, скорее всего это не делается).


AB>Ну ясно. Я сделал две xsl'ки, одна создает дерево вида


AB>
AB><header name="Header1"/>
AB><item name="Item11" header="Header1"/>
AB><item name="Item11_" header="Header1"/>
AB><item name="Item12" header="Header1"/>
AB>...
AB><header name="Header2"/>
AB><item name="Item21" header="Header1"/>
AB><item name="Item21_" header="Header1"/>
AB><item name="Item22" header="Header1"/>
AB>...
AB>

AB>а вторая должна делать остальное.
AB>Но появилась проблема, точнее я не знаю, как сделать. Код вида

AB>
AB><xsl:template match="header">
AB>  <xsl:for-each select="(following-sibling::item)[following-sibling::item/@header=@name]">
AB>    ...
AB>  </xsl:for-each>
AB></xsl:template>
AB>

AB>не находит нужные item'ы. Очевидно, я неправильно написал select. А как правильно?

Можно так:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <root>
            <xsl:apply-templates/>
        </root>
    </xsl:template>
    <xsl:template match="header">
        <xsl:element name="{@name}">
            <xsl:apply-templates select="//item[@header=current()/@name]" mode="item"/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="item" mode="item">
        <xsl:element name="{@name}"/>
    </xsl:template>
</xsl:stylesheet>


P.S. Как правило, не советуют использовать в стилях for-each
Re[5]: Прогресс
От: AliBaba  
Дата: 31.01.02 20:23
Оценка:
Спасибо за пример. Мой тоже заработал, когда я вставил current().
А почему не поощряется for-each?
Re[6]: Прогресс
От: Аноним  
Дата: 01.02.02 09:27
Оценка:
Здравствуйте AliBaba, Вы писали:

AB>Спасибо за пример. Мой тоже заработал, когда я вставил current().

AB>А почему не поощряется for-each?

Процедурный подход -- не соответствует идеологии функционального языка XSLT.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.