Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как преобразовать дату из формата RSS в нормальный вид / 6 сообщений из 6, страница 1 из 1
23.09.2010, 15:11
    #36862610
roschinspb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать дату из формата RSS в нормальный вид
Извините, если вопрос уже задавался, найти не смог
Вопрос как из даты/времени в формате который записывается в RSS, напр.:
Код: plaintext
	<pubDate>Fri,  23  Nov  2007   21 : 00 : 00  GMT</pubDate>
получить в нормальном формате dd.mm.yyyy hh:nn:ss, используя XSL-преобразование?
...
Рейтинг: 0 / 0
23.09.2010, 18:05
    #36863123
prustr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать дату из формата RSS в нормальный вид
<xsl:variable name="dt" select="Date"/>
<xsl:value-of select="substring($dt,6,2)"/>
<xsl:text>.</xsl:text>
<xsl:call-template name="ConvMonth">
<xsl:with-param name="month" select="substring($dt,9,3)"></xsl:with-param>
</xsl:call-template>
<xsl:text>.</xsl:text>
<xsl:value-of select="substring($dt,13,4)"/>


<xsl:template name="ConvMonth">
<xsl:param name="month"/>
<xsl:choose>
<xsl:when test="$month = 'Jan'">01</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="$month = 'Feb'">02</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="$month = 'Mar'">03</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="$month = 'Apr'">04</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="$month = 'May'">05</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="$month = 'Jun'">06</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="$month = 'Jul'">07</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="$month = 'Aug'">08</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="$month = 'Sep'">09</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="$month = 'Oct'">10</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="$month = 'Nov'">11</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="$month = 'Dec'">12</xsl:when>
</xsl:choose>

</xsl:template>
...
Рейтинг: 0 / 0
23.09.2010, 22:16
    #36863508
mage.lan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать дату из формата RSS в нормальный вид
prustr,
с чузами - передоз

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<xsl:template name="ConvMonth">
<xsl:param name="month"/>
<xsl:choose>
<xsl:when test="$month = 'Jan'"> 01 </xsl:when>
<xsl:when test="$month = 'Feb'"> 02 </xsl:when>
<xsl:when test="$month = 'Mar'"> 03 </xsl:when>
<xsl:when test="$month = 'Apr'"> 04 </xsl:when>
<xsl:when test="$month = 'May'"> 05 </xsl:when>
<xsl:when test="$month = 'Jun'"> 06 </xsl:when>
<xsl:when test="$month = 'Jul'"> 07 </xsl:when>
<xsl:when test="$month = 'Aug'"> 08 </xsl:when>
<xsl:when test="$month = 'Sep'"> 09 </xsl:when>
<xsl:when test="$month = 'Oct'"> 10 </xsl:when>
<xsl:when test="$month = 'Nov'"> 11 </xsl:when>
<xsl:when test="$month = 'Dec'"> 12 </xsl:when>
</xsl:choose>
</xsl:template>
...
Рейтинг: 0 / 0
23.09.2010, 22:26
    #36863519
mage.lan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать дату из формата RSS в нормальный вид
roschinspb,

Ваша проблема несколько шире, чем кажется, в сандарте rfc #822 пп 5 описанна спецификация на дату, именно этот стандарт является правильным для RSS, несмотря на это, год часто пишут 4х знаковый.

Ниже привожу код для MSXML, который правильно разбирает любую RSS дату "по стандарту" и не очень.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<?xml version="1.0" encoding="Windows-1251"?>
<?xml-stylesheet type="text/xsl" href="1.xsl"?>

<root>
     <pubDate>Fri,  23  Nov  2007   21 : 00 : 00  GMT</pubDate>
     <pubDate>Fri,  3  Sep  2007   21 : 00 : 00  GMT</pubDate>
     <pubDate> 01  Apr  07   21 : 00 : 00  GMT</pubDate>
</root>

Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
<?xml version="1.0" encoding="Windows-1251"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
	
     <xsl:variable name="_m">
	<month num="1" num2="01" name="Jan" />
	<month num="2" num2="02" name="Feb" />
	<month num="3" num2="03" name="Mar" />
	<month num="4" num2="04" name="Apr" />
	<month num="5" num2="05" name="May" />
	<month num="6" num2="06" name="Jun" />
	<month num="7" num2="07" name="Jul" />
	<month num="8" num2="08" name="Aug" />
	<month num="9" num2="09" name="Sep" />
	<month num="10" num2="10" name="Oct" />
	<month num="11" num2="11" name="Nov" />
	<month num="12" num2="12" name="Dec" />
      </xsl:variable>
      <xsl:variable name="months" select="msxsl:node-set($_m)/month" />
	
      <xsl:template match="/">
	<xsl:apply-templates select="/root/pubDate" />
	<xsl:call-template name="date822toStr">
	      <xsl:with-param name="date" select="'Thu, 22 Sep 10 22:10 MSK'" />
	</xsl:call-template>
    </xsl:template>
    <xsl:template match="pubDate" name="date822toStr">
	<xsl:param name="date" select="text()" />
	<xsl:variable name="date-str">
	      <xsl:variable name="ds">
		<xsl:choose>
			<xsl:when test="contains( $date, ',')">
				<xsl:value-of select="substring-before(substring-after($date, ', '), ':')" />
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="substring-before($date, ':')" />
			</xsl:otherwise>
		</xsl:choose>
	      </xsl:variable>
	      <xsl:value-of select="substring( $ds, 1, string-length( $ds ) - 3 )" />
	</xsl:variable>
	<xsl:value-of select="substring-before( $date-str, ' ')" />
	<xsl:text>-</xsl:text>
	<xsl:value-of select="$months[@name=substring-before( substring-after( $date-str, ' '), ' ')]/@num2" />
	<xsl:text>-</xsl:text>
	<xsl:value-of select="substring-after( substring-after( $date-str, ' '), ' ')" /><BR/>
      </xsl:template>	
</xsl:stylesheet>
в случае использования какого-нить ксалана или другого левого парсера, переделаете выборку месяца из нодесета на функцию, выше.
...
Рейтинг: 0 / 0
24.09.2010, 12:04
    #36864411
roschinspb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать дату из формата RSS в нормальный вид
Спасибо всем откликнувшимся.
Выкладываю то, что получилось, может кому пригодится.
XSL-файл преобразования RSS->HTM<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output method="html"/>
<xsl:variable name="_m">
<month num="1" num2="01" name="Jan"/>
<month num="2" num2="02" name="Feb"/>
<month num="3" num2="03" name="Mar"/>
<month num="4" num2="04" name="Apr"/>
<month num="5" num2="05" name="May"/>
<month num="6" num2="06" name="Jun"/>
<month num="7" num2="07" name="Jul"/>
<month num="8" num2="08" name="Aug"/>
<month num="9" num2="09" name="Sep"/>
<month num="10" num2="10" name="Oct"/>
<month num="11" num2="11" name="Nov"/>
<month num="12" num2="12" name="Dec"/>
</xsl:variable>
<xsl:variable name="months" select="msxsl:node-set($_m)/month"/>
<xsl:template match="pubDate" name="date822toStr">
<xsl:param name="date" select="text()"/>
<xsl:variable name="date-str">
<xsl:variable name="ds">
<xsl:choose>
<xsl:when test="contains( $date, ',')">
<xsl:value-of select="substring-before(substring-after($date, ', '), ':')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="substring-before($date, ':')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="substring( $ds, 1, string-length( $ds ) - 3 )"/>
</xsl:variable>
<xsl:value-of select="substring-before( $date-str, ' ')"/>
<xsl:text>.</xsl:text>
<xsl:value-of select="$months[@name=substring-before( substring-after( $date-str, ' '), ' ')]/@num2"/>
<xsl:text>.</xsl:text>
<xsl:value-of select="substring-after( substring-after( $date-str, ' '), ' ')"/>
<xsl:variable name="ts">
<xsl:value-of select="substring($date, string-length($date-str), string-length($date) )"/>
</xsl:variable>
<xsl:variable name="time-str">
<xsl:value-of select="substring($ts, string-length(substring-before($ts, ':')) - 2, string-length($ts) )"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="contains( $time-str, '00:00:00')">
</xsl:when>
<xsl:otherwise>
<xsl:text> </xsl:text>
<xsl:choose>
<xsl:when test="contains( $time-str, ' MSK')">
<xsl:value-of select="substring-before($time-str, ' MSK')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$time-str"/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="/">
<html>
<xsl:element name="head">
<xsl:element name="style">
<xsl:attribute name="type"><xsl:text>text/css</xsl:text></xsl:attribute>
<xsl:attribute name="media"><xsl:text>all</xsl:text></xsl:attribute>
<xsl:text>@import "styles.css";</xsl:text>
</xsl:element>
</xsl:element>
<body>
<xsl:attribute name="ID"><xsl:text>allbody</xsl:text></xsl:attribute>
<xsl:apply-templates select="//channel"/>
<table ID="dovn" style="WIDTH: 95%" align="center">
<xsl:apply-templates select="//item"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="channel">
<H2>
<xsl:if test="link">
<a>
<xsl:attribute name="href"><xsl:value-of select="link"/></xsl:attribute>
<xsl:element name="img">
<xsl:attribute name="border">0</xsl:attribute>
<xsl:choose>
<xsl:when test="image">
<xsl:attribute name="src"><xsl:value-of select="image"/></xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="src">img/tobegin.gif</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</a>
</xsl:if>
<xsl:value-of select="title"/>
<xsl:if test="pubDate">
<br/>
<small>
<xsl:text>(</xsl:text>
<xsl:call-template name="date822toStr">
<xsl:with-param name="date" select="pubDate"/>
</xsl:call-template>
<xsl:text>)</xsl:text>
</small>
</xsl:if>
</H2>
<div>
<xsl:value-of select="description"/>
</div>
</xsl:template>
<xsl:template match="item">
<xsl:if test="title|link|category">
<tr ID="dovn2">
<td width="128" ID="dovn2">
<xsl:choose>
<xsl:when test="link">
<xsl:for-each select="link">
<xsl:element name="a">
<xsl:attribute name="href"><xsl:value-of select="text()"/></xsl:attribute>
<xsl:element name="img">
<xsl:attribute name="width">22</xsl:attribute>
<xsl:attribute name="height">20</xsl:attribute>
<xsl:attribute name="border">0</xsl:attribute>
<xsl:attribute name="src">img/link1.gif</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:element name="img">
<xsl:attribute name="width">22</xsl:attribute>
<xsl:attribute name="height">20</xsl:attribute>
<xsl:attribute name="border">0</xsl:attribute>
<xsl:attribute name="src">img/link0.gif</xsl:attribute>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</td>
<td ID="dovn2">
<xsl:value-of select="title"/>
<xsl:if test="category">
<xsl:if test="title">
<br/>
</xsl:if>
<small>
<xsl:value-of select="category"/>
</small>
</xsl:if>
</td>
</tr>
</xsl:if>
<tr>
<td width="128" vAlign="middle" ID="dovn">
<xsl:call-template name="date822toStr">
<xsl:with-param name="date" select="pubDate"/>
</xsl:call-template>
</td>
<td ID="dovn">
<xsl:value-of disable-output-escaping="yes" select="description"/>
</td>
</tr>
</xsl:template>
<xsl:template match="image">
<xsl:element name="img">
<xsl:attribute name="src"><xsl:value-of select="url"/></xsl:attribute>
<xsl:attribute name="style">float:left; padding: 10px;</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="language">
</xsl:template>
</xsl:stylesheet>
Тут обрабатываются не все, а только основные тэги.
...
Рейтинг: 0 / 0
24.09.2010, 12:08
    #36864440
roschinspb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать дату из формата RSS в нормальный вид
Пардон забыл SRC поставить, вот оформленый как исходник
XSL-файл преобразования RSS->HTM
Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
	<xsl:output method="html"/>
	<xsl:variable name="_m">
		<month num="1" num2="01" name="Jan"/>
		<month num="2" num2="02" name="Feb"/>
		<month num="3" num2="03" name="Mar"/>
		<month num="4" num2="04" name="Apr"/>
		<month num="5" num2="05" name="May"/>
		<month num="6" num2="06" name="Jun"/>
		<month num="7" num2="07" name="Jul"/>
		<month num="8" num2="08" name="Aug"/>
		<month num="9" num2="09" name="Sep"/>
		<month num="10" num2="10" name="Oct"/>
		<month num="11" num2="11" name="Nov"/>
		<month num="12" num2="12" name="Dec"/>
	</xsl:variable>
	<xsl:variable name="months" select="msxsl:node-set($_m)/month"/>
	<xsl:template match="pubDate" name="date822toStr">
		<xsl:param name="date" select="text()"/>
		<xsl:variable name="date-str">
			<xsl:variable name="ds">
				<xsl:choose>
					<xsl:when test="contains( $date, ',')">
						<xsl:value-of select="substring-before(substring-after($date, ', '), ':')"/>
					</xsl:when>
					<xsl:otherwise>
						<xsl:value-of select="substring-before($date, ':')"/>
					</xsl:otherwise>
				</xsl:choose>
			</xsl:variable>
			<xsl:value-of select="substring( $ds, 1, string-length( $ds ) - 3 )"/>
		</xsl:variable>
		<xsl:value-of select="substring-before( $date-str, ' ')"/>
		<xsl:text>.</xsl:text>
		<xsl:value-of select="$months[@name=substring-before( substring-after( $date-str, ' '), ' ')]/@num2"/>
		<xsl:text>.</xsl:text>
		<xsl:value-of select="substring-after( substring-after( $date-str, ' '), ' ')"/>
		<xsl:variable name="ts">
			<xsl:value-of select="substring($date, string-length($date-str), string-length($date) )"/>
		</xsl:variable>
		<xsl:variable name="time-str">
			<xsl:value-of select="substring($ts, string-length(substring-before($ts, ':')) - 2, string-length($ts) )"/>
		</xsl:variable>
		<xsl:choose>
			<xsl:when test="contains( $time-str, '00:00:00')">
			</xsl:when>
			<xsl:otherwise>
				<xsl:text> </xsl:text>
				<xsl:choose>
					<xsl:when test="contains( $time-str, ' MSK')">
						<xsl:value-of select="substring-before($time-str, ' MSK')"/>
					</xsl:when>
					<xsl:otherwise>
						<xsl:value-of select="$time-str"/>
					</xsl:otherwise>
				</xsl:choose>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
	<xsl:template match="/">
		<html>
			<xsl:element name="head">
				<xsl:element name="style">
					<xsl:attribute name="type"><xsl:text>text/css</xsl:text></xsl:attribute>
					<xsl:attribute name="media"><xsl:text>all</xsl:text></xsl:attribute>
					<xsl:text>@import "styles.css";</xsl:text>
				</xsl:element>
			</xsl:element>
			<body>
				<xsl:attribute name="ID"><xsl:text>allbody</xsl:text></xsl:attribute>
				<xsl:apply-templates select="//channel"/>
				<table ID="dovn" style="WIDTH: 95%" align="center">
					<xsl:apply-templates select="//item"/>
				</table>
			</body>
		</html>
	</xsl:template>
	<xsl:template match="channel">
		<H2>
			<xsl:if test="link">
				<a>
					<xsl:attribute name="href"><xsl:value-of select="link"/></xsl:attribute>
					<xsl:element name="img">
						<xsl:attribute name="border"> 0 </xsl:attribute>
						<xsl:choose>
							<xsl:when test="image">
								<xsl:attribute name="src"><xsl:value-of select="image"/></xsl:attribute>
							</xsl:when>
							<xsl:otherwise>
								<xsl:attribute name="src">img/tobegin.gif</xsl:attribute>
							</xsl:otherwise>
						</xsl:choose>
					</xsl:element>
				</a>
			</xsl:if>
			<xsl:value-of select="title"/>
			<xsl:if test="pubDate">
				<br/>
				<small>
					<xsl:text>(</xsl:text>
					<xsl:call-template name="date822toStr">
						<xsl:with-param name="date" select="pubDate"/>
					</xsl:call-template>
					<xsl:text>)</xsl:text>
				</small>
			</xsl:if>
		</H2>
		<div>
			<xsl:value-of select="description"/>
		</div>
	</xsl:template>
	<xsl:template match="item">
		<xsl:if test="title|link|category">
			<tr ID="dovn2">
				<td width="128" ID="dovn2">
					<xsl:choose>
						<xsl:when test="link">
							<xsl:for-each select="link">
								<xsl:element name="a">
									<xsl:attribute name="href"><xsl:value-of select="text()"/></xsl:attribute>
									<xsl:element name="img">
										<xsl:attribute name="width"> 22 </xsl:attribute>
										<xsl:attribute name="height"> 20 </xsl:attribute>
										<xsl:attribute name="border"> 0 </xsl:attribute>
										<xsl:attribute name="src">img/link1.gif</xsl:attribute>
									</xsl:element>
								</xsl:element>
							</xsl:for-each>
						</xsl:when>
						<xsl:otherwise>
							<xsl:element name="img">
								<xsl:attribute name="width"> 22 </xsl:attribute>
								<xsl:attribute name="height"> 20 </xsl:attribute>
								<xsl:attribute name="border"> 0 </xsl:attribute>
								<xsl:attribute name="src">img/link0.gif</xsl:attribute>
							</xsl:element>
						</xsl:otherwise>
					</xsl:choose>
				</td>
				<td ID="dovn2">
					<xsl:value-of select="title"/>
					<xsl:if test="category">
						<xsl:if test="title">
							<br/>
						</xsl:if>
						<small>
							<xsl:value-of select="category"/>
						</small>
					</xsl:if>
				</td>
			</tr>
		</xsl:if>
		<tr>
			<td width="128" vAlign="middle" ID="dovn">
				<xsl:call-template name="date822toStr">
					<xsl:with-param name="date" select="pubDate"/>
				</xsl:call-template>
			</td>
			<td ID="dovn">
				<xsl:value-of disable-output-escaping="yes" select="description"/>
			</td>
		</tr>
	</xsl:template>
	<xsl:template match="image">
		<xsl:element name="img">
			<xsl:attribute name="src"><xsl:value-of select="url"/></xsl:attribute>
			<xsl:attribute name="style">float:left; padding: 10px;</xsl:attribute>
		</xsl:element>
	</xsl:template>
	<xsl:template match="language">	
</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как преобразовать дату из формата RSS в нормальный вид / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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