/ / XSLT format-liczba, funkcja nie formatuje - xslt, liczby, format

Funkcja numerowania formatu XSLT nie formatująca - xslt, liczby, format

Muszę sformatować wartość do określonego formatu, ale nie wygląda to tak, jakby była obsługiwana.

Chcę użyć:

format-number($value, "####,##,##,##0")

ale wartość zwracana podczas próby to "###,###,##0"

Więc jeśli ja $value = "123456789" Chcę mieć wartość wyjściową jako 1,24,56,789 ale dostaję 123,456,789.

Czy istnieją ograniczenia dotyczące możliwości formatowania?

Jeśli pójdziesz do W3schools i wprowadź następujący xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>123456789</price>
<year>1985</year>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>123456789</price>
<year>1988</year>
</cd>

</catalog>

a następnie następujący xsl:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<xsl:variable name="TestFormat" select=""###,##,##,##0""/>
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="format-number(price, $TestFormat)"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

widać, że nie otrzymuję żądanego formatu. Jakieś sugestie?

Z góry dziękuję za pomoc.

Odpowiedzi:

1 dla odpowiedzi № 1

W przypadku ciągów znaków 8 i 9 działałyby następujące zasady:

      <td>
<xsl:value-of select="substring(price,1,1)"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="substring(price,2,1)"/>
<xsl:value-of select="substring(price,4,1)"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="substring(price,5,2)"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="substring(price,7,3)"/>
<xsl:if test="string-length(price) &lt; 9">
<xsl:value-of select="0"/>
</xsl:if>
</td>

W zależności od Twojego zamiaru, blok „jeśli” może wymagać przesunięcia lub zmiany, aby uzyskać nieco inne formatowanie.


1 dla odpowiedzi nr 2

To naprawdę czas, abyś przeniósł się na XSLT 2.0. W obecnej wersji Saxon Twój kod generuje następujące dane wyjściowe:

<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<tr>
<td>Empire Burlesque</td>
<td>12,34,56,789</td>
</tr>
<tr>
<td>Hide your heart</td>
<td>12,34,56,789</td>
</tr>
</table>
</body>
</html>

1 dla odpowiedzi nr 3

Separator grupowania , jest uwzględniany tylko w pierwszym wystąpieniu od prawej strony po separatorze dziesiętnym. To dlatego, że W3C określa że ciąg wzorca formatu ma składnię określoną przez klasę JDK 1.1 DecimalFormat. Patrząc na tę klasę ujawnia, że ​​ma on właściwość rozmiaru grupowania liczb całkowitych, stąd zmienne rozmiary grup w całym formacie nie mogą być modelowane przez tę klasę.

Dlatego podczas pisania ###,##,##,##0, rozmiar grupowania jest ustawiony na trzy (liczba cyfr między skrajnym prawym separatorem grupującym , i koniec ciągu formatującego i podczas pisania ###,##,##,0, pomiędzy każdą cyfrą będzie separator grupujący.

Jeśli ty naprawdę, naprawdę chcesz to zrobić w XSLT bez żadnych zewnętrznych narzędzi / funkcji formatowania, prawdopodobnie możesz coś stworzyć używając string-length, concat i substring funkcje i ręczne wstawianie separatorów grup.

Aktualizacja: Te instrukcje są ważne tylko dla XSLT 1.0.