parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Да, могу, но есть причины, по которым я не хотел бы этого делать

Slava 15.03.2005 23:31

Дело в том, что я отношу названия месяцев к уровню представления а не содержания. Поэтому возлагаю работы по формированию названий на xslt-шаблон. Например, я работаю над классом news. Я старюсь делать его как можно более универсальным, поэтому его методы возвращают результат в xml-формате. Для каждой новости дата представлена примерно в таком виде:
<news-entry day="13" month="3" year="2005">...</news-entry>
И пусть шаблон уже сам определяет как эту дату представлять:
- так: "13.03.2005";
- или так: "13 марта 2005 года";
- или же, если на украинском, то так: "13 березня 2005".

Кроме того, я переписал метод "Склонение имен существительных после числительных" из "примеров" на язык таблиц стилей по той же самой причине.
Вот несколько модифицированный пример (код на языке xsl получился немного громоздским)
<!-- пример вызова шаблона
в result-stat/@total укзано число найденных документов 
на месте решетки # будет стоять число
-->
<xsl:template match="results">
	<xsl:call-template name="num-decline">
		<xsl:with-param name="num" select="result-stat/@total"/>
		<xsl:with-param name="nominative" select="'Всего найден #&nbsp;документ.'"/>
		<xsl:with-param name="genitive-singular" select="'Всего найдено #&nbsp;документа.'"/>
		<xsl:with-param name="genitive-plural" select="'Всего найдено #&nbsp;документов.'"/>
	</xsl:call-template>
</xsl:template>

<!-- а вот и сам шаблон -->
<xsl:template name="num-decline">
<xsl:param name="num"/>
<xsl:param name="nominative"/>
<xsl:param name="genitive-singular"/>
<xsl:param name="genitive-plural"/>
<xsl:choose>
	<xsl:when test="$num > 10 and floor(($num mod 100) div 10) = 1">
	  <xsl:value-of select="concat(substring-before($genitive-plural, '#'),$num,substring-after($genitive-plural, '#'))"/>
	</xsl:when>
	<xsl:otherwise>
		<xsl:choose>
			<xsl:when test="$num mod 10 = 1"><xsl:value-of select="concat(substring-before($nominative, '#'),$num,substring-after($nominative, '#'))"/></xsl:when>
			<xsl:when test="4 >= $num mod 10 and $num mod 10 >= 2"><xsl:value-of select="concat(substring-before($genitive-singular, '#'),$num,substring-after($genitive-singular, '#'))"/></xsl:when>
			<xsl:otherwise><xsl:value-of select="concat(substring-before($genitive-plural, '#'),$num,substring-after($genitive-plural, '#'))"/></xsl:otherwise>
		</xsl:choose>
	</xsl:otherwise>
</xsl:choose>
</xsl:template>
Мне интересны следующие моменты:
- можно ли в подобных ситуациях пожетрвовать производительностью ради универсальности кода?
- существенно ли xslt-шабон будет отличаться по производительности от кода на самом парсере?
- действительно ли на практике нужна такая универсальность?