2011-01-21 8 views
3

Мне нужна помощь в преобразовании файла XSLT 1.0 в 2.0 (так что я могу использовать вызов функции XSLT 2.0 replace()).Преобразование XSLT 1.0 в 2.0

Я googled, искал разные книги и так безрезультатно. Я попытался изменить version="1.0" на 2.0 и сменить html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en" на просто html, но это все приводит к ошибкам XSLTProcessor.

Любая помощь очень ценится. Заранее спасибо.

Вот мой 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? –

+0

Я не уверен - он обрабатывается PHP (версия 5.2.6). – Ryan

+2

Я считаю, что PHP использует libxslt и не поддерживает XSLT 2.0. –

ответ

3

В дополнение к изменению атрибута version в '2.0', вам нужно кормить код 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> 

Как правило, некоторые рефакторинга давно для этого кода.

+0

Спасибо за ваши отзывы. Я только что обнаружил, что мой php-сервер ограничен XSLT 1.0. я найти XSLT 1.0 [решение для функции замены] [1] (спасибо @Alejandro): подстроку (detailpath, 9 * начинается-с (detailpath, '/ События /')) Я попытался включить эту функцию с вашим пересмотренным кодом, но все равно получаю различные ошибки. Как я могу упростить код ссылки с помощью этой функции? [1]: http://stackoverflow.com/questions/4754332/regex-to-remove-word-from-xslt – Ryan

Смежные вопросы