2011-12-06 31 views
5

Tôi cần phải chuyển đổi chuỗi 'abcdef' thành các phần của nó, 'a', 'b', 'c', 'd', 'e', ​​'f'. Ngớ ngẩn tôi đã thử tokenize ('abcdef', '') nhưng tất nhiên là trả về lỗi FORX0003 (Biểu thức chính quy trong tokenize() không được là đối sánh với chuỗi có độ dài bằng 0).Trong XSLT tôi có thể tokenize trên không có gì?

Tôi thực sự cố gắng chuyển đổi chuỗi cuối cùng thành 'a/b/c/d/e/f' để mọi phím tắt sẽ đưa tôi trực tiếp đến trạng thái này cũng sẽ hữu ích.

(Tôi đang sử dụng Saxon 9,3 cho nền tảng .NET)

Trả lời

2

Sử dụng dòng này:

replace(replace($input, "(.)", "$1/", "s"), "(.*).$", "$1", "s") 

đâu $input điểm tại chuỗi ban đầu của bạn. Sự trở lại của dòng này là chuỗi mong muốn của bạn.

a/b/c/d/e/f 
5

Để có được chuỗi ký tự mong muốn từ một chuỗi $str sử dụng cặp chức năng string-to-code-points()codepoints-to-string():

for $c in string-to-codepoints($str) 
return 
    codepoints-to-string($c) 

Để có được chuỗi ký tự này được nối với '/' làm chuỗi tham gia, chỉ cần áp dụng string-join() trên biểu thức ở trên.

Dưới đây là một mã đầy đủ ví dụ:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:sequence select= 
     "string-join(
       for $c in string-to-codepoints('ABC') 
       return 
       codepoints-to-string($c), 
      '/' 
        ) 
     "/> 
</xsl:template> 
</xsl:stylesheet> 

tạo ra nhân vật chuỗi truy nã:

A/B/C 

Giải thích:

string-to-codepoints($str) tạo ra một chuỗi các mã-điểm (nghĩ về chúng như là "mã ký tự") đại diện cho mỗi ký tự của chuỗi.

Ví dụ:;

string-to-codepoints('ABC') 

tạo ra chuỗi:

65 66 67 

codepoints-to-string($code-seq) 

là hàm nghịch đảo của string-to-codepoints(). Với một chuỗi các điểm mã, nó tạo ra chuỗi ký tự, có các ký tự được biểu diễn bằng các điểm mã trong dãy. Như vậy:

codepoints-to-string((65,66,67)) 

tạo ra chuỗi:

ABC 

Do đó:

for $c in string-to-codepoints($str) 
return 
    codepoints-to-string($c) 

nhận được điểm mã của mỗi nhân vật cá nhân trong $str và chuyển đổi nó vào một riêng chuỗi.

Sử dụng string-join() chúng tôi sau đó tham gia tất cả các chuỗi riêng biệt bằng cách sử dụng ký tự liên kết được cung cấp "/".

+0

Giải pháp này hoạt động hoàn hảo nhưng tôi đã chấp nhận câu trả lời FailedDev như nó ngắn và hơi dễ dàng hơn cho (đơn giản) người (như tôi) để hiểu –

+0

@TheArtfulBenny: Dễ hiểu ??? Bạn * phải * nói đùa. –

Các vấn đề liên quan