Конвертировать XSLT 1.0 в 2.0 - PullRequest
       0

Конвертировать XSLT 1.0 в 2.0

3 голосов
/ 21 января 2011

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

Я гуглил, искал разные книги и ТАК безуспешно. Я попытался изменить 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>

Ответы [ 3 ]

3 голосов
/ 21 января 2011

В дополнение к изменению атрибута 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 голос
/ 22 января 2011

Пока вы конвертируете код, вы должны избавиться от этих уродливых атрибутов 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>

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

1 голос
/ 22 января 2011

Вам также следует проверить ненормативное Приложение XSLT 2.0 J Отличия от XSLT 1.0 .

В этом разделе перечислены все известные случаи. где таблица стилей, которая была действительной (без ошибок) под XSLT 1.0, и чье поведение было полностью указано к XSLT 1.0, будет производить разные результаты по XSLT 2.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...