powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как преобразовать дату из формата RSS в нормальный вид
6 сообщений из 6, страница 1 из 1
Как преобразовать дату из формата RSS в нормальный вид
    #36862610
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините, если вопрос уже задавался, найти не смог
Вопрос как из даты/времени в формате который записывается в RSS, напр.:
Код: plaintext
	<pubDate>Fri,  23  Nov  2007   21 : 00 : 00  GMT</pubDate>
получить в нормальном формате dd.mm.yyyy hh:nn:ss, используя XSL-преобразование?
...
Рейтинг: 0 / 0
Как преобразовать дату из формата RSS в нормальный вид
    #36863123
prustr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
<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
Как преобразовать дату из формата RSS в нормальный вид
    #36863508
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как преобразовать дату из формата RSS в нормальный вид
    #36863519
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как преобразовать дату из формата RSS в нормальный вид
    #36864411
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем откликнувшимся.
Выкладываю то, что получилось, может кому пригодится.
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
Как преобразовать дату из формата RSS в нормальный вид
    #36864440
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон забыл 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
6 сообщений из 6, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как преобразовать дату из формата RSS в нормальный вид
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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