2015-07-16 89 views
7

我有一個帶有研討會的XML文件,我想提供給Google日曆。 XML文件由其他人維護,並定期更新,因此我想以Google自動抓取這些更改的方式執行此操作。將XML提供給Google日曆

我對這種事情沒有太多經驗,所以我希望有人能指出我正確的方向。

這是我想要處理的XML的一個示例。

(XML文件:「seminars.xml」)

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="ical.xsl"?> 

<seminars> 
    <lastupdate>20150707</lastupdate> 

    <seminar> 
    <speaker>A. Einstein</speaker> 
    <location>Zurich</location> 
    <date>20150607</date> 
    <time>15:45:00</time> 
    <university>Princeton</university> 
    <abstract> 
     <title>On the structure of generalized patent office spaces</title> 
     <content>To be announced.</content> 
    </abstract> 
    </seminar> 

</seminars> 

最明顯的方式實現這一目標,我會說,是用它處理XML和建立一些文件谷歌XSLT樣式表-calendar可以讀取。我有一個網站/服務器,我可以把這個XSL文件放在這麼理想的位置,我希望只需要上傳一個正確的文件即可。

我看起來像這樣的XSL表。

(XSL文件: 「ical.xsl」)

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" encoding="iso-8859-1" media-type="text/calendar"/> 
<xsl:variable name="crlf">&#13;&#10;</xsl:variable> 
<xsl:template match="/">BEGIN:VCALENDAR<xsl:value-of select="$crlf"/> 
CALSCALE:GREGORIAN<xsl:value-of select="$crlf"/> 
VERSION:2.0<xsl:value-of select="$crlf"/> 
SEQUENCE:1<xsl:value-of select="$crlf"/> 
X-WR-TIMEZONE:Europe/Paris<xsl:for-each select="seminars/seminar"><xsl:value-of select="$crlf"/> 
BEGIN:VEVENT<xsl:value-of select="$crlf"/> 
LOCATION:<xsl:value-of select="location"/><xsl:value-of select="$crlf"/> 
DTSTART:<xsl:value-of select="date"/>T154500<xsl:value-of select="$crlf"/> 
DTEND:<xsl:value-of select="date"/>T164500<xsl:value-of select="$crlf"/> 
DESCRIPTION:seminar by <xsl:value-of select="speaker"/><xsl:value-of select="$crlf"/> 
SUMMARY:<xsl:value-of select="abstract/title"/><xsl:value-of select="$crlf"/> 
END:VEVENT<xsl:value-of select="$crlf"/></xsl:for-each> 
END:VCALENDAR<xsl:value-of select="$crlf"/> 
</xsl:template> 
</xsl:stylesheet> 

這工作,如果我處理XML文件,它管將iCal文件(xsltproc seminars.xml > mycal.ics),並在導入到一些日曆谷歌日曆。 產生的mycal.ics看起來像這樣

BEGIN:VCALENDAR 
CALSCALE:GREGORIAN 
VERSION:2.0 
SEQUENCE:1 
X-WR-TIMEZONE:Europe/Paris 
BEGIN:VEVENT 
LOCATION:Zurich 
DTSTART:20150607T154500 
DTEND:20150607T164500 
DESCRIPTION:seminar by A. Einstein 
SUMMARY:On the structure of generalized patent office spaces 
END:VEVENT 

現在的問題是,(1)谷歌不處理XML,從而在導入和(2)我不知道,如果這種方法會自動將「產生錯誤抓取更改「,因爲它需要偶爾重新加載XML。

那麼,有沒有辦法讓谷歌(或網絡服務器)處理這個文件,因此它被識別爲一個iCal文件,保持最新?

最後一個小問題是原始的XML裏面還有一個不同的XSL文件。有沒有一種簡單的方法可以將我的網站上的符號鏈接製作成這個文件,或者包含沒有標題的XML,這樣我就可以用我的原來的XSL替換原來的XSL了?

回答

1

最簡單的解決方案可能是在Web服務器上創建一個從xml轉換爲ical的CGI。如果在Linux Web服務器運行,則CGI可以爲下列文件那麼簡單(我把它叫做seminars

#!/usr/bin/sh 
echo Content-type: text/calendar 
echo 
/usr/bin/xsltproc ical.xsl seminars.xml 2> /dev/null 

這個CGI腳本由Bourne shell的處理。這是由第一行指定的。以下2行使用ical日曆的媒體類型(mime類型)完成HTTP標頭。最後一行使用您的XSLt轉換進行轉換。請注意,由於處理指令導致的錯誤將被忽略(重定向到/ dev/null)。

請注意,您的服務器必須配置爲運行CGI。我測試了它在Apache 2和需要

chmod 755 seminars   # make CGI file executable 
chmod . 711     # close directory to others (suexec) 

我還創建了一個.htacces$文件上diretory以確保seminars腳本處理爲CGI

<Files seminars> 
    SetHandler cgi-script 
</Files>