Làm cách nào để chuyển đổi một chuỗi thành chữ hoa hoặc chữ thường với XSLT?


118

Làm cách nào để bạn thực hiện chuyển đổi trường hợp trong XSL?

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

Câu trả lời:


194

Trong XSLT 1.0, các chức năng upper-case()lower-case()không có sẵn. Nếu bạn đang sử dụng biểu định kiểu 1.0, phương pháp chuyển đổi trường hợp phổ biến là 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
Có phiên bản Unicode không? Giải pháp này sẽ không hoạt động với các nhân vật hài hước ...
mjs

1
Đối với XSLT 1.0, bạn sẽ phải thêm nhiều hơn vào các biến chữ hoa / chữ hoa hoặc sử dụng một hàm mở rộng.
Jon W

1
Nếu bạn quyết định không sử dụng chức năng mở rộng, bạn có thể tạo một danh sách đầy đủ bằng cách sử dụng Cơ sở dữ liệu ký tự Unicode: unicode.org/Public/UNIDATA/UCD.html
Jon W

13
Dưới đây là bảng ANSI hoàn thành: dịch (% s, 'ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞŸŽŠŒ', 'abcdefghijklmnopqrstuvwxyzàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿžšœ')
A.Game

41

XSLT 2.0 có upper-case()lower-case()chức năng. Trong trường hợp XSLT 1.0, bạn có thể sử dụng translate():

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

9

Việc triển khai .NET XSLT cho phép viết các hàm được quản lý tùy chỉnh trong biểu định kiểu. Đối với chữ thường (), nó có thể là:

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

Giả sử, điều đó có thể chậm, nhưng vẫn có thể chấp nhận được.

Đừng quên bật hỗ trợ tập lệnh nhúng để chuyển đổi:

// 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
Giải pháp này sẽ hoạt động với bất kỳ ký tự nào, ngay cả những ký tự Unicode kỳ lạ. Điều này rất hiệu quả đối với tôi, nhưng tôi đã đơn giản hóa phần thân phương pháp return (stringValue ?? string.Empty).ToLower();. Cảm ơn @Vladislav, tôi chưa bao giờ biết bạn có thể làm được điều đó!
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

0

Đối với mã hóa ký tự ANSI:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.