2014-12-19 2 views
-3

У меня есть XML, который имеет поле Десятичное число, которое необходимо отформатировать в формате европейской валюты. The Current его формат в США.Форматировать все десятичные узлы в европейском формате. Форматирование

-<Envelope> 
-<Body> 
    -<getPriceRecommendationResponse> 
    -<status> 
    <statusCode>Success</statusCode> 
    </status> 
    -<priceRecommendation> 
    <tssArticleNumber>Item Number1234</tssArticleNumber> 
    <compoundCode>N123</compoundCode> 
    <compoundGroupCodeBucket>A</compoundGroupCodeBucket> 
    <compoundCodeBucket>N123 & others</compoundCodeBucket> 
    <qualityIndexCode>-</qualityIndexCode> 
    <qualityIndexBucket>Std Quality</qualityIndexBucket> 
    <weight>66.0341</weight> 
    <weightGroupBucket>BT 123.1234 and 12345.1234</weightGroupBucket> 
    <weightIsValidBucket>YES</weightIsValidBucket> 
    <subGroupCode>PT</subGroupCode> 
    <subGroupCodeBucket>7:B03</subGroupCodeBucket> 
    <stockDistinction>MTS</stockDistinction> 
    <productIdBucket>PT0401450-T46N</productIdBucket> 
    <referencePrice>42.076</referencePrice> 
    <averageQuantity>9</averageQuantity> 
    <quantityAdjustments>0.96</quantityAdjustments> 
    <highDV>2.123789</highDV> 
    <averageDV>1.25141</averageDV> 
    <lowDV>0.79983</lowDV> 
    <additionalAdjustmentsTotal>1</additionalAdjustmentsTotal> 
    <highPrice>19876.9124796544</highPrice> 
    <averagePrice>12345.5481540736</averagePrice> 
    <lowPrice>123344567.3075011968</lowPrice> 
    </priceRecommendation> 
    </getPriceRecommendationResponse> 
</Body> 
</Envelope> 

Пожалуйста, помогите мне с xslt, который может форматировать все десятичные узлы в XML.

Ниже представлен xslt, который я уже использую. Я ожидаю подобного. Спасибо

//this has been taken from a Microsoft knowledgebase aricle and strips out the 
//namespaces from an XML message using a style sheet 
XslTransform := XslTransform.XslTransform; 
XMLStyleSheet := XMLStyleSheet.XmlDocument; 
XMLStyleSheet.InnerXml(
'<?xml version="1.0" encoding="UTF-8"?>'+ 
'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:msxml="urn:schemas-microsoft-com:xslt">'+ 
'<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="UTF-8" indent="yes"/>' + 
'<xsl:template match="@*|node()">'+ 
'<xsl:copy>'+ 
'<xsl:apply-templates select="@*|node()"/>'+ 
'</xsl:copy>'+ 
'</xsl:template>'+ 
'<xsl:template match="'+OldNode+'">'+ 
'<xsl:variable name="oldNode" select="'+OldNode+'"/>' + 
'<xsl:variable name="newNodeXml">' + 
'<xsl:element name="'+NewNode+'">' + 
'<xsl:copy-of select="$oldNode/@*|node()"/>' + 
'<xsl:copy-of select="$oldNode/child::*"/>' + 
'<xsl:copy-of select="$oldNode/@*"/>' + 
'</xsl:element>' + 
'</xsl:variable>' + 
'<xsl:copy-of select="msxml:node-set($newNodeXml)"/>' + 
'</xsl:template>' + 
'</xsl:stylesheet>' 
); 
XslTransform.Load(XMLStyleSheet); 
writer := writer.StringWriter(); 
XslTransform.Transform(Source, nullXsltArgumentList, writer); 
Destination := Destination.XmlDocument; 
Destination.InnerXml(writer.ToString()); 

Спасибо, ребята, за ваш ответ. Надеюсь, я смогу сделать вещи более ясными для вас. Европейский формат - «,» для разделителя децимал и «.». для группировки цифр. В то время как у США есть обратная сторона. Например, 1000.156 в США и 1.000.156 для Европы. Да, Rnet я пробовал десятичный формат работы, но проблема здесь в том, что мне нужно использовать его несколько раз для полей. Я хочу, чтобы XSLT изменял формат для всех десятичных полей одновременно. Надеюсь, вы получили мою точку зрения

Спасибо, Майкл, я пробовал свой код, но получаю сообщение об ошибке. Не удалось выполнить вызов System.Xml.Xsl.XslTransform.Load с этим сообщением: выражение должно оцениваться в наборе узлов.

Я немного изменил код, данный Майклом, но все еще получаю ту же ошибку.

'<?xml-stylesheet type="text/xsl" href="decimalformat.xsl"?>'+ 
'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">'+ 
'<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>'+ 
'<xsl:strip-space elements="*"/>'+ 
'<xsl:decimal-format name="eu" decimal-separator="," grouping-separator="." />'+ 
'<!-- identity transform -->'+ 
'<xsl:template match="@*|node()">'+ 
' <xsl:copy>'+ 
'   <xsl:apply-templates select="@*|node()"/>'+ 
' </xsl:copy>'+ 
'</xsl:template>'+ 
'<xsl:template match="*[number()=number()]">'+ 
' <xsl:copy>'+ 
'  <xsl:value-of select=translate("format-number(., '#.##0,##########', 'eu'), ',', '.')" />'+ 
' </xsl:copy>'+ 
'</xsl:template>'+ 
'</xsl:stylesheet>' 

В моей заявке не работает. Я нашел аналогичную должность здесь http://mikeschinkel.com/blog/gettingpastthexslterrorexpressionmustevaluatetoanodeset/#comment-484235

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

Я получаю сообщение об ошибке, если я включать код выше. Я тоже пробовал это.

<xsl:value-of select=translate("format-number(., '#.##0,##########', 'eu'), ',', '.')" /> 
+0

Что такое "Европейская валютная форма"? Отправьте требуемый код вывода. –

+0

Поиск в Интернете дает, и format-number(), вы их пробовали? http://www.w3schools.com/xsl/el_decimal-format.asp – Rnet

+0

Спасибо, ребята, за ваш ответ. Надеюсь, я смогу сделать вещи более ясными для вас. Европейский формат - «,» для разделителя децимал и «.». для группировки цифр. В то время как у США есть обратная сторона. Например, 1000.156 в США и 1.000.156 для Европы. Да, Rnet я пробовал десятичный формат работы, но проблема здесь в том, что мне нужно использовать его несколько раз для полей. Я хочу, чтобы XSLT изменял формат для всех десятичных полей одновременно. Надеюсь, вы получили мою точку зрения. –

ответ

1

проблема здесь я должен использовать его несколько раз для полей. I хочу XSLT, который меняет формат для всех десятичных полей в один раз.

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

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:decimal-format name="eu" decimal-separator=',' grouping-separator='.' /> 

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

<xsl:template match="*[number()=number()]"> 
    <xsl:copy> 
     <xsl:value-of select="format-number(., '#.##0,##########', 'eu')" /> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Примечание:

  1. Это не сработает с вашим вводом, потому что он содержит неэкранированный символ амперсанда;

  2. Это будет не элементы процесса, которые содержат числа в качестве части строки, например:
    <weightGroupBucket>BT 123.1234 and 12345.1234</weightGroupBucket>

  3. Это не имеет ничего общего с валютой.

+0

Спасибо, Майкл, я пробовал свой код, но получаю сообщение об ошибке. Не удалось выполнить вызов System.Xml.Xsl.XslTransform.Load с этим сообщением: выражение должно оцениваться в наборе узлов. Я немного изменил код, но не смог решить эту ошибку. –

+1

@PrajeeshNair Ошибка не из-за моего кода - см. Его здесь: http: //xsltransform.net/bFDb2C4 –

Смежные вопросы