Bagaimana cara mengonversi string menjadi huruf besar atau kecil dengan XSLT?

118

Bagaimana Anda melakukan konversi kasus di XSL?

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

Jawaban:

195

Di XSLT 1.0, fungsi upper-case()dan lower-case()tidak tersedia. Jika Anda menggunakan stylesheet 1.0, metode umum untuk konversi huruf besar adalah 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>
Jon W.
sumber
5
Apakah ada versi Unicode? Solusi ini tidak akan berhasil dengan karakter lucu ...
mjs
1
Untuk XSLT 1.0 Anda harus menambahkan lebih banyak ke variabel huruf kecil / huruf besar atau menggunakan fungsi ekstensi.
Jon W
1
Jika Anda memutuskan untuk tidak menggunakan fungsi ekstensi, Anda mungkin dapat membuat daftar lengkap menggunakan Unicode Character Database: unicode.org/Public/UNIDATA/UCD.html
Jon W
13
Berikut adalah tabel ANSI lengkap: menerjemahkan (% s, 'ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞŸŽŠŒ', 'abcdefghijklmnopqrstuvwxyzàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿžšœ')
A.Game
41

XSLT 2.0 memiliki upper-case()dan lower-case()berfungsi. Dalam kasus XSLT 1.0, Anda dapat menggunakan translate():

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

Implementasi .NET XSLT memungkinkan untuk menulis fungsi terkelola kustom di stylesheet. Untuk huruf kecil () dapat berupa:

<?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>

Asumsikan, itu bisa lambat, tapi masih bisa diterima.

Jangan lupa untuk mengaktifkan dukungan skrip tertanam untuk transformasi:

// 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());
Vladislav
sumber
3
Solusi ini akan berfungsi dengan karakter apa pun, bahkan karakter Unicode yang aneh. Ini bekerja dengan baik untuk saya, tetapi saya menyederhanakan metode body menjadi return (stringValue ?? string.Empty).ToLower();. Terima kasih @Vladislav, saya tidak pernah tahu Anda bisa melakukan itu!
Joe Skeen
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
Natalie Pan
sumber
0

Untuk pengkodean karakter ANSI:

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

huruf besar (string) dan huruf kecil (string)

Eric Petroelje
sumber
13
Ini hanya di XPath 2.0.
kojiro