Требуется помощь по XSL - PullRequest
       5

Требуется помощь по XSL

4 голосов
/ 19 ноября 2010

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

<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 to format-number

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

<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

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

Ответы [ 3 ]

4 голосов
/ 19 ноября 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>
1 голос
/ 19 ноября 2010

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

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

Этот код, например, соответствует всем узлам Details и для каждого соответствия получает итоговую сумму за заказ. Затем он применяет шаблон применить к формату, передавая итоговое значение в качестве параметра. Сопоставление происходит по значению узла форматирования.

Я думаю, что формат '###. ###. 00' недопустим, так как кажется, что допускается только одна десятичная точка. '###, ###. 00' нормально.

0 голосов
/ 19 ноября 2010

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

<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', определенная .Условие теста принимает операторы XPath, такие как Format (дочерний узел деталей) / text () (дочерний текстовый узел формата)

...