XSL: десятичный формат с несколькими возможными форматами - PullRequest
1 голос
/ 23 февраля 2009

У меня есть интересная проблема с XSL. У нас есть входной файл XML, который содержит рядом с контентом несколько настроек, которые определяют, как мы выводим контент. В настоящее время я борюсь с форматированием чисел в файле XSL.

Возможны следующие форматы:

  • 1,234.5
  • 1.234,5
  • 1234,5
  • 1234,5

Я получаю эти форматы, как указано выше, в моем XML-файле:

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <settings>
        <DefaultCurrency>EUR</DefaultCurrency>
        <DefaultDateFormat>DD.MM.YYYY</DefaultDateFormat>
    <DefaultNumberFormat>1.250,65</DefaultNumberFormat>
    <AllowOrdering>true</AllowOrdering>
</settings>
<productlist>
    <item>
        <product>
            <productid>Product1</productid>
            <weight>0.123</weight>
        </product>
        <customerprice>123.03</customerprice>
    </item>
    <item>
        <product>
            <productid>Product2</productid>
            <weight>12312.123</weight>
        </product>
        <customerprice>12.00</customerprice>
    </item>
    <item>
        <product>
            <productid>Product3</productid>
            <weight>12.123</weight>
        </product>
        <customerprice>13.23</customerprice>
    </item>
</productlist>
</document>

Я пытался заставить это работать со следующим XSL-файлом, но я не могу заставить его дать мне правильные результаты (при изменении DefaultNumberFormat в XML форматирование также должно быть изменено).

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:decimal-format name="numberformat1" decimal-separator="." grouping-separator=","/>
    <xsl:decimal-format name="numberformat2" decimal-separator=","/>
    <xsl:decimal-format name="numberformat3" decimal-separator="," grouping-separator="."/>
    <xsl:decimal-format name="numberformat4" decimal-separator="."/>
    <xsl:template match="productlist">
        <xsl:apply-templates select="item"/>
    </xsl:template>
    <xsl:template match="item">
ItemID: <xsl:value-of select="product/productid"/>
Weigh: 
<xsl:choose>
            <xsl:when test="/document/settings/DefaultNumberFormat = '1,250.65'">
                <xsl:value-of select="format-number(product/weight, '#,##0.000', 'numberformat1')"/>
            </xsl:when>
            <xsl:when test="/document/settings/DefaultNumberFormat = '1250,65'">
                <xsl:value-of select="format-number(product/weight, '#,##0.000', 'numberformat2')"/>
            </xsl:when>
            <xsl:when test="/document/settings/DefaultNumberFormat = '1.250,65'">
                <xsl:value-of select="format-number(product/weight, '#,##0.000', 'numberformat3')"/>
            </xsl:when>
            <xsl:when test="/document/settings/DefaultNumberFormat = '1250.65'">
                <xsl:value-of select="format-number(product/weight, '#,##0.000', 'numberformat4')"/>
            </xsl:when>
        </xsl:choose>
    </xsl:template>
    <xsl:template match="settings/*"/>
</xsl:stylesheet>

Я надеюсь, что кто-то может помочь мне здесь, я думаю, что я каким-то образом понял, как объединить формат числа и формат числа ...

Спасибо, Мартейн

Ответы [ 2 ]

3 голосов
/ 23 февраля 2009

В XSLT format-number - это обычная функция XPath, которая принимает строки в качестве второго и третьего аргумента. Эти строки не нужно указывать как константы в таблице стилей - их также можно вычислить во время выполнения из исходного документа.

В простейшем случае давайте предположим, что исходный документ фактически указывает аргументы непосредственно как settings/picture `settings / formatname '. Если это так, вы можете написать:

<xsl:value-of select="format-number(product/weight,
                                    settings/picture,
                                    settings/formatname)"/>

В качестве альтернативы, если документ использует другую нотацию, что делает необходимым выполнение шага перевода, вы можете реорганизовать таблицу стилей для использования переменных XSLT, например:

<xsl:variable name="picture">
  <!-- compute the picture string here, e.g. using <xsl:choose> and -->
  <!-- /document/settings/DefaultNumberFormat -->
</xsl:variable>

<xsl:variable name="formatname">
  <!-- compute the number format name here, e.g. using <xsl:choose> and -->
  <!-- /document/settings/DefaultNumberFormat -->
</xsl:variable>

<xsl:value-of select="format-number(product/weight, $picture, $formatname)"/>
0 голосов
/ 23 февраля 2009

Следующее преобразование вычисляет, какой числовой формат использовать :

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

    <xsl:variable name="vDFormats">
        <dFormat spec="1,250.65" name="numberformat1"/>
        <dFormat spec="1250,65" name="numberformat2"/>
        <dFormat spec="1.250,65" name="numberformat3"/>
        <dFormat spec="1250.65" name="numberformat4"/>
    </xsl:variable>

    <xsl:variable name="vDefFormats" select=
     "document('')/*/xsl:variable
                      [@name='vDFormats']"/>

    <xsl:variable name="vtheFormatName" select=
     "string($vDefFormats/*
              [@spec = $vDoc/*/settings/DefaultNumberFormat]
                                   /@name
           )
   "/>

    <xsl:decimal-format name="numberformat1" 
         decimal-separator="." grouping-separator=","/>
    <xsl:decimal-format name="numberformat2" 
         decimal-separator=","/>
    <xsl:decimal-format name="numberformat3" 
         decimal-separator="," grouping-separator="."/>
    <xsl:decimal-format name="numberformat4" 
         decimal-separator="."/>

    <xsl:template match="productlist">
        <xsl:apply-templates select="item"/>
    </xsl:template>

    <xsl:template match="item">ItemID: <xsl:text/> 
        <xsl:value-of select="product/productid"/> Weigh: <xsl:text/> 
        <xsl:value-of select=
        "format-number(product/weight, 
                       '#,##0.000', 
                       $vtheFormatName)"/>
    </xsl:template>

    <xsl:template match="settings/*"/>
</xsl:stylesheet>

При применении к следующему документу XML :

<document>
  <settings>
    <DefaultNumberFormat>1,250.65</DefaultNumberFormat>
  </settings>

    <productlist>
      <item>
        <product>
          <productid>30</productid>
          <weight>2530.45</weight>
        </product>
      </item>
    </productlist>
</document>

желаемый результат получен :

ItemID: 30 Weigh: 2,530.450
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...