2009-09-23 2 views
1

поведение по умолчанию XSL на правой сторонеxslt для управления значением элемента перед отображением?

http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog

предназначен для отображения таблицы с 2-колонки с названием и художником каждого компакт-диска в формате XML на левой стороне. (Это показано по умолчанию в разделе «Ваш результат» внизу.)

Я хочу изменить xsl, чтобы узнать о применении функций xsl для текста, возвращаемого из элементов XML. (Вот whole list of xsl string functions.) Например, существует функция fn: upper-case (string), которая преобразует строку в верхний регистр.

Какова была бы минимальная модификация xsl, показанная there, которая создавала бы ту же таблицу, кроме как с названиями компакт-дисков в верхнем регистре?

ответ

2

Поскольку XSL на этой странице version="1.0", вы можете изменить эту строку

<td><xsl:value-of select="title"/></td> 
          ^^^^^ 

к этому:

<td><xsl:value-of select="translate(title, 'abcdefghijklnmopqrstuvwxyz', 'ABCDEFGHIJKLNMOPQRSTUVWXYZ')"/></td> 
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

Хотя с процессор, поддерживающий XPath 2.0, вы должны использовать это вместо:

<td><xsl:value-of select="upper-case(title)"/></td> 
          ^^^^^^^^^^^^^^^^^ 
+0

Очень ценю обсуждение версий 1.0 и 2.0 XPath и XSLT (так что я узнаю, что эти версии существуют). Но я принял этот самый простой ответ, потому что (а) он кажется правильным ответом именно на вопрос, который я задал, и (б) он работает на странице, которую я дал. Но спасибо всем респондентам! – talkaboutquality

+0

Кроме того, этот ответ дает мне понять, как я вставляю вызов функции в оператор select для имени элемента. То есть, начиная с фрагмента select = "title" Мне не было ясно, где бы я поместил имя функции и ее круглые скобки. Теперь понятно. – talkaboutquality

+0

Я думаю, я не могу редактировать более ранние комментарии? Поэтому, обновляя свой первый комментарий, я вижу, что этот ответ также кратко рассмотрел версию 2.0. Этот ответ был коротким, кратким и правильным. Вот почему я принял это. – talkaboutquality

3

Обновление: Работает только в процессоре с поддержкой XPath 2.0.

Я думаю, что следующее должно делать то, что вы хотите ... не забудьте объявить пространство имен fn (xmlns: fn = ...) или вообще не объявлять пространство имен.

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!-- Edited by XMLSpy® --> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions"> 

<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>My CD Collection</h2> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th>Title</th> 
     <th>Artist</th> 
     </tr> 
     <xsl:for-each select="catalog/cd"> 
     <tr> 
     <td><xsl:value-of select="fn:upper-case(title)"/></td> 
     <td><xsl:value-of select="artist"/></td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 
+0

В XPath 1.0 (и, следовательно, в XSLT 1.0) нет «верхнего регистра». –

+0

Позвольте мне просто проверить, что эта таблица стилей работает отлично под Saxon-B 9.1.0.6 – Brabster

+0

Да, Павел, конечно, прав. Эти функции доступны в XPath 2.0, поэтому я не подозреваю об этом на сайте w3schools. Если вы используете XPath 2.0-совместимый процессор, вы можете использовать их, как указано выше. В противном случае вам нужно будет создать функцию, чтобы сделать это самостоятельно. – Brabster

0

Ссылка на список функций, которые вы предоставляете для XPath 2.0, XSLT 2.0 и XQuery 1.0. Таблица стилей, на которую вы ссылаетесь, это XSLT 1.0, которая не поддерживает большинство этих функций. В частности, он не поддерживает upper-case().

4

upper-case - это функция XSLT 2.0. Если вам случится иметь 2.0 таблицы стилей (что пример не является) и двигатель, чтобы преобразовать его затем использовать его так же просто, как:

<xsl:value-of select="upper-case(title)"/> 

Однако в печально еще более общего 1.0 вашего лучшего плана состоит в использовании один из:

  • пользовательского расширения (платформа изменения)
  • утомительной XSLT перевести функцию translate(title,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ'), которая является грубым и проблематичной с I18N
  • простой text-transform:uppercase; (как правило, лучшее решение CSS, потому что это Обычно проблема стиля не проблема данных)
+0

Каково минимальное изменение исходного кода XSL-кода для применения этого «простого текстового преобразования CSS: прописные буквы»? решение? – talkaboutquality

+0

@downvoter - wth? – annakata

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