Вопрос по XML+XSL

Anton

Just Programmer
Вопрос по XML+XSL

Народ, будте добры, помогите. Только если можно поскорей, а то горит :))

Вобщем есть XML (приведен ниже). Проще и не придумать. Есть только одна закавыка, а именно в последжней новосте есть такая фича как <bold>, что должно позвалять это слово выделять как-то, ну например жирно или что еще.

<?xml version="1.0" encoding="WINDOWS-1251"?>
<?xml-stylesheet type='text/xsl' href='news.xsl'?>
<newsLine>
<news id="1">
<date>2002-12-12</date>
<title>title 1</title>
<text>news text 1</text>
</news>
<news id="2">
<date>2002-10-10</date>
<title>title 2</title>
<text>news text 2</text>
</news>
<news id="3">
<date>2002-11-11</date>
<title>title 3</title>
<text>news <bold>text 3</text>
</news>
</newsLine>

Пишу к нему XSL который будет эти новости выводить.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

<xsl:text>NEWS</xsl:text>
<table>

<xsl:for-each select="newsLine/news">
<xsl:sort order="descending" select="date"/>
<tr>
<td>
<xsl:value-of select="date"/>
<xsl:text> - </xsl:text>
<xsl:value-of select="title"/><br/>
<xsl:value-of select="text"/>
</td>
</tr>
</xsl:for-each>
<xsl:apply-templates/>
</table>

</xsl:template>

<xsl:template match="bold">

<b><xsl:value-of select="bold"/></b>

</xsl:template>
</xsl:stylesheet>

Как бы так это написать что бы в выоде он действительно жирным становлся??? Народ, помогите. Я понимаю что выглядит самое задание не лепо, но оно учебное и его срочно надо. Сам пока не осилил :)) Иду мучать его далее, если кто подскажет то будет круто :))
 

Sababa

Guest
1. XML не well-formed, должен быть закрывающий тег у <bold>:

<text>news <bold>text 3</bold></text>

2.

<xsl:template match="/">
<xsl:text>NEWS</xsl:text>
<table>
<xsl:for-each select="newsLine/news">
<xsl:sort order="descending" select="date"/>
<tr>
<td>
<xsl:value-of select="date"/>
<xsl:text> - </xsl:text>
<xsl:value-of select="title"/><br/>
<xsl:apply-templates/>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>

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

<xsl:template match="bold">
<b><xsl:value-of select="."/></b>
</xsl:template>
 

Anton

Just Programmer
Круть, спасибо. Уже стало гораздо лучше. Выбеление жирным появилось. Но при этом новость выводиться немного не так ... там к телу приолепляеться повторение заголовка.

NEWS
2002-12-12 - title 1
2002-12-12title 1news text 1
2002-11-11 - title 3
2002-11-11title 3news text 3
2002-10-10 - title 2
2002-10-10title 2news text 2

Вместо:
NEWS
2002-12-12 - title 1
news text 1
2002-11-11 - title 3
news text 3
2002-10-10 - title 2
news text 2
 

Sababa

Guest
<xsl:template match="/">
<xsl:text>NEWS</xsl:text>
<table>
<xsl:for-each select="newsLine/news">
<xsl:sort order="descending" select="date"/>
<tr>
<td>
<xsl:value-of select="date"/>
<xsl:text> - </xsl:text>
<xsl:value-of select="title"/><br/>
<xsl:apply-templates select="text"/>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>

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

<xsl:template match="bold">
<b><xsl:value-of select="."/></b>
</xsl:template>
 

Anton

Just Programmer
Гы ... спасибо. Заработало. :)) Только капашась в инете я понял что XML все равно не корректный получился. Нельзя делать такие вложения
<text> test <b>test</b> test </text>
То есть элимент может содержать в себе др. элименты или текст, а не смесь ... или я не так понял? И как в таком случае реализовать такое выделение?
 

Anton

Just Programmer
Да? Было бы хорошо. :)) Спасибо за помощь. Я хоть теперь въехал кака это делать. Тогда последний вопрос ... кака будет выглядить DTD для этого xml. Мне непонятно как опсать тогда этот <bold> который на ровне с данными содержиться в text. Я смотрю в книжки типа умные, там такого невстречаеться ...

<!ELEMENT newsLine (news+)>
<!ELEMENT news (date, title, text)>
<!ATTLIST news id ID #REQUIRED>
<!ELEMENT date (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT text (bold)(#PCDATA)> - Так что ли? Как-тонепонтяно ...
<!ELEMENT bold (#PCDATA)>
 

Anton

Just Programmer
Ой ..кажись нашел пример ... Правилен?

<!ELEMENT newsLine (news+)>
<!ELEMENT news (date, title, text)>
<!ATTLIST news id ID #REQUIRED>
<!ELEMENT date (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT text (#PCDATA | bold*)> - Вот это?
<!ELEMENT bold (#PCDATA)>
 

Anton

Just Programmer
Гы ... все таки пока не отстану ... во что пишет ... непонял .. В книжках именно так и пишут. Если конечно написать ANY то все работает, но это не метод . хоца точного рписания ... :-(

Mixed content model cannot contain this character. Line 8, Position 31

<!ELEMENT text (#PCDATA | bold*)>
------------------------------^
 

Anton

Just Programmer
Так это же будет значить, что элимент text встречаеться 0 или много раз ... а надо сказать, что bold внутри text встречаеться 0 или много раз ... ЭЭЭ ... во как.
 

Sababa

Guest
из книжки:
формальные правила смешанного содержимого должны всегда иметь вид (#PCDATA | ... | ... )*
 

Anton

Just Programmer
Хорошая книжка. Правильная. Спасибо большое Sababa. Огромное человеческое спасибо. :)) Очень помог.
 

Tagore

Guest
Я тоже

Хочу сделать, что бы у меня не ПХП темплатес а XML и XSL стоял на новом сайте. Но вопросьб тогда, если у меня брать инфо из MySql, то как быть. Может Xml Spy 5.0?

Вот туториал по этому и так
 
Сверху