Як я можу перетворити рядок у верхній чи нижній регістр за допомогою XSLT?


118

Як зробити перетворення справ у XSL?

<xsl:variable name="upper">UPPER CASE</xsl:variable>
<xsl:variable name="lower" select="???"/>

Відповіді:


195

У XSLT 1.0 функції upper-case()та lower-case()функції недоступні. Якщо ви використовуєте таблицю стилів 1.0, поширеним методом перетворення справ є translate():

<xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />


<xsl:template match="/">
  <xsl:value-of select="translate(doc, $lowercase, $uppercase)" />
</xsl:template>

5
Чи є версія Unicode? Це рішення не буде працювати з кумедними персонажами ...
міс

1
Для XSLT 1.0 вам доведеться додати більше до змінних малого / великого регістру або використовувати функцію розширення.
Джон Ш

1
Якщо ви вирішили не використовувати функцію розширення, можливо, ви зможете скласти повний список за допомогою бази даних символів Unicode: unicode.org/Public/UNIDATA/UCD.html
Jon W

13
Ось повна таблиця ANSI: переводити (% S, 'ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞŸŽŠŒ', 'abcdefghijklmnopqrstuvwxyzàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿžšœ')
A.Game

41

XSLT 2.0 має upper-case()і lower-case()функціонує. У випадку XSLT 1.0 ви можете використовувати translate():

<xsl:value-of select="translate("xslt", "abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ")" />

9

Реалізація .NET XSLT дозволяє записувати власні керовані функції в таблицю стилів. Для малих регістрів () це може бути:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:utils="urn:myExtension" exclude-result-prefixes="msxsl">

  <xsl:output method="xml" indent="yes"/>

  <msxsl:script implements-prefix="utils" language="C#">
    <![CDATA[
      public string ToLower(string stringValue)
      {
        string result = String.Empty;

        if(!String.IsNullOrEmpty(stringValue))
        {
          result = stringValue.ToLower(); 
        }

        return result;
      }
    ]]>
  </msxsl:script>

  <!-- using of our custom function -->
  <lowercaseValue>
    <xsl:value-of select="utils:ToLower($myParam)"/>
  </lowercaseValue>

Припустимо, це може бути повільним, але все ж прийнятним.

Не забудьте включити підтримку вбудованих сценаріїв для перетворення:

// Create the XsltSettings object with script enabled.
XsltSettings xsltSettings = new XsltSettings(false, true);

XslCompiledTransform xslt = new XslCompiledTransform();

// Load stylesheet
xslt.Load(xsltPath, xsltSettings, new XmlUrlResolver());

3
Це рішення працюватиме з будь-якими символами, навіть із дивними Unicode. Це добре працювало для мене, але я спростив метод методу до return (stringValue ?? string.Empty).ToLower();. Спасибі @Владислав, я ніколи не знав, що ти можеш це зробити!
Джо Скін

2
<xsl:variable name="upper">UPPER CASE</xsl:variable>
<xsl:variable name="lower" select="translate($upper,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"/>
<xsl:value-of select ="$lower"/>

//displays UPPER CASE as upper case

0

Для кодування символів ANSI:

 translate(//variable, 'ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞŸŽŠŒ', 'abcdefghijklmnopqrstuvwxyzàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿžšœ')

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.