Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Помогите убрать вложенный элемент img / 15 сообщений из 15, страница 1 из 1
06.08.2010, 09:31
    #36778677
Centraloff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите убрать вложенный элемент img
Добрый день!
Я не слишком часто сталкиваюсь с xml поэтому не очень в нем силен, но тут возникла задача убрать рисунки из rss канала. Помогите пожалуйста, а то сильно долго разбираться в этом насколько я понял.
Вобщем вот пример rss

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
<item>
    	<title>Заголовок</title>
		<link>Ссылка</link>
        <category>Категория</category>
		<pubDate>Чтв,  05  Авг  2010   14 : 47 : 22  + 0400 </pubDate>
		<description><![CDATA[
<img src="http://css.metalinfo.ru/tmp/1/b/4/1b4ed035ac8b976625ffdedb49198cee.jpg" width="200" height="259" hspace="5" align="left">Текст новости
		]]></description>

Вот текущий xslt

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:dc="http://purl.org/dc/elements/1.1/">
    <xsl:output omit-xml-declaration="yes" method="html" encoding="utf-16"/>

    <xsl:template match='/rss'>
      <h3>
        <xsl:value-of select='channel/title'/>
      </h3>
      <xsl:apply-templates select='channel/item' />
    </xsl:template>

  <xsl:template match='item'>
    <div style='margin:6px;'>
      <strong>
        <a href='{link}'>
          <xsl:value-of select='title'/>
        </a>
      </strong><br/>
      <strong>Дата публикации: </strong>
      <xsl:value-of select='pubDate'/>
      <br/>
      <xsl:value-of select='description' disable-output-escaping='yes'/>
      <xsl:text disable-output-escaping='yes'>&nbsp;</xsl:text>
      <a href='{link}'>Читать дальше...</a><br/>
      <xsl:if test='dc:creator'>
        <strong>Автор: </strong><xsl:value-of select='dc:creator'/>
        <br/>
      </xsl:if>
    </div>
  </xsl:template>
  <xsl:template match='category'>
    <xsl:value-of select='.'/>
  </xsl:template>
</xsl:stylesheet>

Каким образом можно вобще убрать img, и еще хотелось бы в pubDate оставить только дату, а время убрать. Помогите пожалуйста. Заранее большое спасибо
...
Рейтинг: 0 / 0
06.08.2010, 10:04
    #36778718
Anton_Demin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите убрать вложенный элемент img
Centraloff,

надо скопировать исходный XML
посмотри xsl:copy и xsl:copy-of
копируй все кроме тега description, или убивай не нужное содержимое тега description
...
Рейтинг: 0 / 0
06.08.2010, 10:10
    #36778729
Centraloff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите убрать вложенный элемент img
Anton_Demin,

Дак как раз все содержимое description нужно кроме img, ситуация осложняется тем что у img нет закрывающего тега, видимо поэтому xsl:copy не работает, я попробовал так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- Обработчик рисунков -->
  <xsl:template match="img">
    <xsl:apply-templates/>
  </xsl:template>

не помогло
...
Рейтинг: 0 / 0
06.08.2010, 10:23
    #36778756
Anton_Demin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите убрать вложенный элемент img
Centraloff,

если я не ошибаюсь, то <![CDATA[....]]> подразумевается как содержимое тега description
т.е. ты img не можешь обработать как тег, его надо обрабатывать как текст.
...
Рейтинг: 0 / 0
06.08.2010, 10:31
    #36778776
Centraloff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите убрать вложенный элемент img
Anton_Demin,

Вот тут находится xml http://www.metalinfo.ru/ru/news/rnonferrous.rss
нельзя ли поподробнее как это сделать, а то если честно я пробовал убрать весь description он даже его целиком не убирает. Спасибо большое.
...
Рейтинг: 0 / 0
06.08.2010, 11:10
    #36778879
Anton_Demin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите убрать вложенный элемент img
Centraloff,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 <xsl:template match="*">
   <xsl:copy>
		<xsl:apply-templates select="@* | node() "/>
   </xsl:copy>
 </xsl:template>

 <xsl:template match="@*">
  <xsl:copy-of select="." />
</xsl:template>

 <xsl:template match="node()[name()='description']">
		<xsl:text></xsl:text>
 </xsl:template>
...
Рейтинг: 0 / 0
06.08.2010, 11:55
    #36779004
Andry Trushin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите убрать вложенный элемент img
Centraloff,

Для всех тегов:

Код: plaintext
1.
2.
3.
4.
5.
<xsl:template match="*" priority="-1">
   <xsl:copy>
       <xsl:copy-of select="@*"/>
       <xsl:apply-templates />
   </xsl:copy>
</xsl:template>

Для pubDate, обрезаем строку

Код: plaintext
1.
2.
3.
4.
5.
<xsl:template match="pubDate">
   <xsl:copy>
       <xsl:copy-of select="@*"/>
       <xsl:value-of select="substring(.,1, 16)" />
   </xsl:copy>
</xsl:template>

Для description - прийдется повозится

Код: 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.
<xsl:template match="description">
   <xsl:copy>
       <xsl:copy-of select="@*"/>
       
       <xsl:call-template name="crop-img">
           <xsl:with-param name="out" select="." />
       </xsl:call-template>
   </xsl:copy>
</xsl:template>

<xsl:template name="crop-img">
   <xsl:param name="out" />

   <xsl:choose>
      <xsl:when test="contains( $out, 'img')">
          <xsl:value-of select="subsctring-before( $out, '<img' )" />
          <xsl:call-template name="crop-img">
              <xsl:with-param name="out" select="subsctring-after( $out, '>' )" />
          </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
         <xsl:value-of select="$out" />
      </xsl:otherwise>
   </xsl:choose>
</xsl:template>

ну а это должно быть так, если конечно кроме img у тебя нет других "невалидных" тегов в CDATA
Код: plaintext
<xsl:output method="xml" encoding="utf-16"/>
...
Рейтинг: 0 / 0
06.08.2010, 11:57
    #36779010
Andry Trushin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите убрать вложенный элемент img
в строковых функциях вместо < и > должны быть соответственно &lt; и &gt;
...
Рейтинг: 0 / 0
06.08.2010, 14:45
    #36779439
Centraloff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите убрать вложенный элемент img
Andry Trushin,

Огромное вам спасибо, очень помогли, правда я в итоге сделал более простое, но менее универсальное решение:

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <xsl:output omit-xml-declaration="yes" method="html" encoding="utf-16"/>

  <xsl:template match="/rss">
    <h3>
      <xsl:value-of select="channel/title"/>
    </h3>
    <xsl:apply-templates select="channel/item"/>
  </xsl:template>

  <xsl:template match="item">
      <p>
        <strong>
          <a href="{link}">
            <xsl:value-of select="title"/>
          </a>
        </strong>
        <br/>
        <strong>Дата публикации: </strong>
        <xsl:apply-templates select="pubDate"/>
        <br/>
        <xsl:apply-templates select="description"/>
        <a href="{link}">Читать дальше...</a>
        <br/>
      </p>
  </xsl:template>
  <xsl:template match="description">
    <xsl:value-of select="substring-after(.,'>')" disable-output-escaping="yes"/>
  </xsl:template>

  <xsl:template match="pubDate">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:value-of select="substring(.,1, 16)" />
    </xsl:copy>
  </xsl:template> 
</xsl:stylesheet>

Только возникла еще одна проблема, каким образом можно вернуть первые пять записей, попробовал сделать так:
Код: plaintext
1.
<xsl:apply-templates select="channel/item [ position() < 5 ]"/>

Но студия ругается, что тег не закрыт, хотя на форумах советуют делать именно так, не подскажете как обойти это?
...
Рейтинг: 0 / 0
06.08.2010, 15:05
    #36779493
Centraloff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите убрать вложенный элемент img
Centraloff,

Все решил и эту проблему. Теперь все отлично ))
...
Рейтинг: 0 / 0
06.08.2010, 15:06
    #36779496
walek
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите убрать вложенный элемент img
Centraloff,

Код: plaintext
<xsl:apply-templates select="channel/item [ position() < 5 ]"/>
...
Рейтинг: 0 / 0
06.08.2010, 15:06
    #36779498
walek
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите убрать вложенный элемент img
Centraloff,

<xsl:apply-templates select="channel/item [ position() < 5 ]"/>
...
Рейтинг: 0 / 0
06.08.2010, 15:07
    #36779503
walek
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите убрать вложенный элемент img
Вот чёрт, форум экранирует &lt ;
...
Рейтинг: 0 / 0
06.08.2010, 15:08
    #36779507
Centraloff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите убрать вложенный элемент img
walek,

Хыы & lt ; тока все без пробелов
...
Рейтинг: 0 / 0
06.08.2010, 22:39
    #36780288
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите убрать вложенный элемент img
Centraloffне помоглоПоменяйте эти два шаблона местами
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Помогите убрать вложенный элемент img / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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