Требуется справка по XSL

Привет. Я новичок в XSL и почти не знаю нескольких команд. Я пробовал образец, в котором мне нужно отформатировать число на основе записи в XML. Я хочу использовать функцию format-number для достижения того же.

<Details>
<Order>Bulk Order</Order>
<OrderDate>1997-07-16T19:20:30+01:00</OrderDate>
<Quantity>100</Quantity>
<Price>99.45</Price>
<Format>de_DE</Format>
</Details>


<Details>
<Order>Bulk Order</Order>
<OrderDate>1997-07-16T19:20:30+01:00</OrderDate>
<Quantity>100</Quantity>
<Price>99.45</Price>
<Format>en_US</Format>
</Details>

Однако я могу отобразить вывод, если использую:

<xsl:value-of select='format-number(500100, "###,###.00")' />

Но я хочу использовать определенное условие

т. е. если формат de_DE: я хочу передать метод ###.###,00 в формат числа (обратите внимание на десятичные разделители и разделители тысяч) или если формат en_US, я хочу передать ###,# ##.00 в метод форматирования числа

Я безнадежно пытался использовать оператор выбора (но я действительно понятия не имею о синтаксисе использования)

<xslt:choose>
    <xslt:when test="$format = 'de_DE'">###,###.00</xslt:when>
    <xslt:when test="$format = 'en_US'">###.###,00</xslt:when>
    <xslt:otherwise>###.###,00</xslt:otherwise>
</xslt:choose>

Может ли кто-нибудь помочь мне поместить это в шаблон или что-то в этом роде, чтобы я просто вызывал и получал вывод на основе формата, представленного в XML

Спасибо, Шриватса.


person this-Me    schedule 19.11.2010    source источник
comment
Хороший вопрос, +1. Смотрите мой ответ для лучшего, действительно XSLT-решения. Не стесняйтесь принять мой ответ :)   -  person Dimitre Novatchev    schedule 19.11.2010
comment
@@this-Me: Не пора ли принять лучший ответ?   -  person Dimitre Novatchev    schedule 18.09.2011


Ответы (3)


Вы можете применить шаблоны и сопоставить значение текстового узла следующим образом:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">


<xsl:template match="/">        
    <xsl:apply-templates select="/root/Details"/>
</xsl:template>

<xsl:template match="Details">      

    <xsl:variable name="total" select="Price * Quantity"/>

    <xsl:apply-templates select="Format">
        <xsl:with-param name="total" select="$total"/>
    </xsl:apply-templates>

</xsl:template>

<xsl:template match="Format[text()='de_DE']">
    <xsl:param name="total"/>       
    <xsl:value-of select="format-number($total, '###.###.00')"/>
</xsl:template>

<xsl:template match="Format[text()='en_US']">
    <xsl:param name="total"/>       
    <xsl:value-of select="format-number($total, '###,###.00')"/>
</xsl:template>

This code for example, matches all Details nodes and for each match gets the total for the order. It then does an apply-template on the format passing in the total as a parameter. The match then occurs on the value of the format node.

Я думаю, что формат «###.###.00» недействителен, так как кажется, что разрешена только одна десятичная точка. '###,###.00' подходит.

person Ellis    schedule 19.11.2010

Для этого в XSLT есть директива <xsl:decimal-format>. случае.

Это преобразование:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:decimal-format name="de_DE" decimal-separator="." grouping-separator="," />
 <xsl:decimal-format name="en_US" decimal-separator="," grouping-separator="."/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="Price/text()">
  <xsl:value-of select="format-number(., '#,###.##', ../../Format)"/>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML-документу (завернуто в узел верхнего элемента, чтобы сделать его правильно сформированным):

<t>
    <Details>
        <Order>Bulk Order</Order>
        <OrderDate>1997-07-16T19:20:30+01:00</OrderDate>
        <Quantity>100</Quantity>
        <Price>1199.45</Price>
        <Format>de_DE</Format>
    </Details>
    <Details>
        <Order>Bulk Order</Order>
        <OrderDate>1997-07-16T19:20:30+01:00</OrderDate>
        <Quantity>100</Quantity>
        <Price>1199.45</Price>
        <Format>en_US</Format>
    </Details>
</t>

дает желаемый результат:

<t>
    <Details>
        <Order>Bulk Order</Order>
        <OrderDate>1997-07-16T19:20:30+01:00</OrderDate>
        <Quantity>100</Quantity>
        <Price>1,199.45</Price>
        <Format>de_DE</Format>
    </Details>
    <Details>
        <Order>Bulk Order</Order>
        <OrderDate>1997-07-16T19:20:30+01:00</OrderDate>
        <Quantity>100</Quantity>
        <Price>1199,45</Price>
        <Format>en_US</Format>
    </Details>
</t>
person Dimitre Novatchev    schedule 19.11.2010

Предполагая, что вы находитесь в соответствии с шаблоном для узлов «Подробности», вы можете сделать что-то вроде этого:

<xslt:choose> 
    <xslt:when test="Format/text() = 'de_DE'"><xsl:value-of select="format-number(Price, '###,###.00')" /></xslt:when> 
    <xslt:when test="Format/text() = 'en_US'"><xsl:value-of select="format-number(Price, '###.###,00')" /></xslt:when> 
    <xslt:otherwise><xsl:value-of select='format-number(Price, "###.###,00")' /></xslt:otherwise> 
</xslt:choose> 

$format используется, когда у вас есть переменная с именем 'format', определенная с помощью ‹xslt:variable/›. Условие теста принимает операторы XPath, такие как Format (дочерний узел Details) / text() (текстовый дочерний узел Format)

person Sir Wobin    schedule 19.11.2010