2011-01-21 186 views
3

我需要幫助將XSLT 1.0文件轉換爲2.0(所以我可以使用XSLT 2.0 replace()函數調用)。將XSLT 1.0轉換爲2.0

我已經谷歌搜索,搜索不同的書籍,所以沒有成功。我嘗試將version="1.0"更改爲2.0,並將html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"更改爲html,但這全部導致XSLTP處理器錯誤。

任何幫助,非常感謝。提前致謝。

這裏是我的XSLT:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0"> 
<xsl:output method="xml" omit-xml-declaration="yes" indent="no" 
     doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
     doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" encoding="ISO-8859-1" /> 
<xsl:template match="/"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
<xsl:element name="meta"> 
<xsl:attribute name="name">description</xsl:attribute> 
<xsl:attribute name="content"><xsl:value-of select="EventList/title"/></xsl:attribute> 
</xsl:element> 
<xsl:element name="link"><xsl:attribute name="rel">alternate</xsl:attribute><xsl:attribute name="type">application/rss+xml</xsl:attribute><xsl:attribute name="title">RSS</xsl:attribute><xsl:attribute name="href"><xsl:value-of select="EventList/rssURL"/></xsl:attribute></xsl:element> 
</head> 
<body> 
<xsl:apply-templates select="EventList" /> 
</body> 
</html> 
</xsl:template> 
<xsl:template match="EventList"> 
<xsl:choose> 
    <xsl:when test="Event"> 
    <xsl:apply-templates select="Event"/> 
    </xsl:when> 
    <xsl:otherwise> 
    <div class="eventItem"> 
    <div class="eventItemText"> 
    <p>There are currently no events posted for this category.</p> 
    </div> 
    </div> 
    </xsl:otherwise> 
</xsl:choose> 
</xsl:template> 
<!-- List --> 
<xsl:template match="Event"> 
<li> 
    <!-- Title --> 
    <xsl:if test="eventStatus = 2"><xsl:value-of select="eventStatusString"/> - </xsl:if> 
    <xsl:element name="a"><xsl:attribute name="href">http://events.stanford.edu/e/e/?d=<xsl:value-of select="replace(detailpath,'/events/','')"/></xsl:attribute><xsl:attribute name="id"><xsl:value-of select="eventID"/></xsl:attribute><xsl:attribute name="rel">external</xsl:attribute> 
    <xsl:value-of select="title" disable-output-escaping="yes"/> 
    </xsl:element> 
    <!-- Date and time --> 
    <xsl:element name="a"><xsl:attribute name="href">http://events.stanford.edu/e/details.php?detailpath=<xsl:value-of select="detailpath"/></xsl:attribute><xsl:attribute name="rel">external</xsl:attribute> 
    <xsl:choose> 
    <xsl:when test="repeatRuleID &gt; 0"> 
    Ongoing <xsl:value-of select="repeatRuleText"/> from <xsl:value-of select="beginDate"/> through <xsl:value-of select="repeatUntilDate"/>. 
    <xsl:if test="repeatRuleID=99">See details for exact dates and times.</xsl:if> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:if test="string(beginDay)"><xsl:value-of select="beginDay"/>, </xsl:if> 
    <xsl:value-of select="beginDate"/>. 
    </xsl:otherwise> 
    </xsl:choose> 
    <xsl:if test="repeatRuleID!=99"> 
    <xsl:if test="string(beginTime)"> 
    <xsl:text disable-output-escaping="yes"></xsl:text><xsl:value-of select="beginTime"/>. 
    </xsl:if> 
    </xsl:if> 
    </xsl:element> 
    <!-- Location --> 
    <xsl:element name="a"><xsl:attribute name="href">http://events.stanford.edu/e/details.php?detailpath=<xsl:value-of select="detailpath"/></xsl:attribute><xsl:attribute name="rel">external</xsl:attribute> 
    <xsl:value-of select="locationText"/> 
    </xsl:element> 
</li> 
</xsl:template> 
</xsl:stylesheet> 
+0

您使用的是支持XSLT 2.0的處理器嗎? – 2011-01-21 19:23:30

+0

我不確定 - 它正在被PHP(版本5.2.6)處理。 – Ryan 2011-01-21 19:42:10

回答

3

除了改變version屬性​​,你需要養活你的XSLT 2.0代碼的XSLT 2.0處理器

目前,一些XSLT 2.0處理器我使用有:

待辦事項一個現有的XSLT 1.0代碼可以表現不同下XSLT 2.0 - 最明顯的區別是<xsl:value-of>不再產生僅從節點集的第一個節點的字符串值,並且在XSLT 2.0可怕的RTF類型已被淘汰,因此不需要/提供xxx:node-set()擴展功能。

1

您還應該檢查非規範XSLT 2.0附錄J Changes from XSLT 1.0

本節列出所有已知的情況下 其中,這是有效的樣式表 (沒有產生錯誤)下XSLT 1.0, ,其行爲由XSLT 1.0完全指明 ,會產生XSLT 2.0下不同 結果。

1

當你轉換代碼時,你應該擺脫那些醜陋的disable-output-escaping =「yes」屬性。他們幾乎肯定不是想要的。該屬性的使用通常表明它是由對語言理解不深的新手編寫的。這也適用於像

<xsl:element name="a"><xsl:attribute name="href">http://events.stanford.edu/e/e/?d=<xsl:value-of select="replace(detailpath,'/events/','')"/></xsl:attribute><xsl:attribute name="id"><xsl:value-of select="eventID"/></xsl:attribute><xsl:attribute name="rel">external</xsl:attribute> 
    <xsl:value-of select="title" disable-output-escaping="yes"/> 
    </xsl:element> 

使用冗長結構的,可以由更可讀

<a href="http://events.stanford.edu/e/e/?d={replace(detailpath,'/events/','')}" 
    id="{@eventID}" rel="external"> 
    <xsl:value-of select="title"/> 
</a> 

通常被替換,一些重構是這個代碼姍姍來遲。