2011-12-06 8 views
5

Potrzebuję przekształcić ciąg "abcdef" na jego części, "a", "b", "c", "d", "e", "f". Głupio próbowałem tokenize ('abcdef', '') , ale oczywiście to zwraca błąd FORX0003 (Wyrażenie regularne w tokenize() nie musi być takim, które pasuje do łańcucha o zerowej długości).W XSLT mogę tokenize na nic?

Naprawdę próbuję przekształcić łańcuch w końcu na "a/b/c/d/e/f", więc przydatne będą również skróty, które doprowadzą mnie bezpośrednio do tego stanu.

(używam Saxon 9.3 dla platformy .NET)

Odpowiedz

2

Użyj tej linii:

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

Gdzie $input punkty w oryginalnym ciąg. Zwrot tej linii jest twoim żądanym ciągiem.

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

Aby uzyskać żądaną sekwencję znaków z ciągu $str wykorzystać parę funkcji string-to-code-points() i codepoints-to-string():

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

Aby dostać ta sekwencja znaków połączona z "/" jako ciągiem łączenia, wystarczy zastosować string-join() w powyższym wyrażeniu.

Oto pełna przykładowy kod:

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

wywołuje żądaną sekwencję znaków:

A/B/C 

Objaśnienie:

string-to-codepoints($str) produkuje sekwencję punkty kodowe (traktuj je jako "kody znaków") reprezentujące każdy znak ciągu.

Na przykład;

string-to-codepoints('ABC') 

generuje sekwencję:

65 66 67 

codepoints-to-string($code-seq) 

ma funkcję odwrotną string-to-codepoints(). Biorąc pod uwagę sekwencję punktów kodowych, tworzy ciąg znaków, którego znaki są reprezentowane przez współrzędne w sekwencji. Zatem:

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

wytwarza ciąg:

ABC 

Dlatego:

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

dostaje kodowy każdego indywidualnego charakteru w $str i konwertuje go do oddzielnym napisu.

Korzystając z string-join(), dołączamy do wszystkich takich oddzielnych ciągów, korzystając z dołączonego znaku "/".

+0

To rozwiązanie działa doskonale ale już zaakceptowane jako odpowiedź FailedDev jest krótszy i nieco łatwiej (proste) ludzi (takich jak ja), aby zrozumieć –

+0

@TheArtfulBenny: Łatwiej zrozumieć ??? Musisz żartować. –