У меня есть 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'), ',', '.')" />
Что такое "Европейская валютная форма"? Отправьте требуемый код вывода. –
Поиск в Интернете дает, и format-number(), вы их пробовали? http://www.w3schools.com/xsl/el_decimal-format.asp –
Rnet
Спасибо, ребята, за ваш ответ. Надеюсь, я смогу сделать вещи более ясными для вас. Европейский формат - «,» для разделителя децимал и «.». для группировки цифр. В то время как у США есть обратная сторона. Например, 1000.156 в США и 1.000.156 для Европы. Да, Rnet я пробовал десятичный формат работы, но проблема здесь в том, что мне нужно использовать его несколько раз для полей. Я хочу, чтобы XSLT изменял формат для всех десятичных полей одновременно. Надеюсь, вы получили мою точку зрения. –