Java XSLTTransform to XML错误的节点值

时间:2018-01-25 12:59:12

标签: java xml transform javax

我在转换XML时遇到了一些奇怪的问题。我有一个XSLTtemplate来应用XML并获得生成的XML。 我有一个java进程来做这个,这个工作从10年以来很好...所以java方法是正确的,当然。否则,我几乎可以肯定问题是javax.xml.Transformer api。 我使用xml-apis-1.3.04.jar库来做到这一点。 我已经使用XSLT和XML源以及此网页检查了http://www.utilities-online.info/xsltransformation,结果是Web应用程序页面和我的java进程之间的差异。我要表明:

问题出在XML的具体节点中,并且具有String to Number转换。 XSLT节点:

<Sold>
                        <xsl:attribute name="amountCurrencyID" namespace="">EUR</xsl:attribute>
                        <xsl:value-of select="string(number(string($var4_resultof_first/*[local-name()='Sold' ])))"/>
                    </Sold>

源XML:

<Sold>1064623.94</Sold>

好吧,将de xlst与source xml和....两个结果一起应用于java(不正确)和上面提到的网页(正确):

JAVA:

<Sold amountCurrencyID="EUR">**1.06462394E6**</Sold>

WEBPAGE:

<Sold amountCurrencyID="EUR">1064623.94</Sold>

获胜者是WebPage,因为正确的值不得具有指数(E6)&#39;指示符。这个指标&#39; fu ** me in other java method。

事实上,可能是图书馆改变这个问题?我认为XSLT不是问题,如果在网页上是正确的?重点是什么?

javaCode就是这样做:

public void convert() throws ClassNotFoundException, InstantiationException, IllegalAccessException, TransformerException {
    TransformerFactory transformerFactory = new net.sf.saxon.TransformerFactoryImpl();

    Source xsltSource = new StreamSource(new ByteArrayInputStream(this.getUserInfo().getXslt()));
    // creamos la plantilla en si
    Templates templates = transformerFactory.newTemplates(xsltSource);           

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    // preparamos la entrada
    Source xmlSource = new StreamSource(getBais());
    // preparamos la salida
    Result result = new StreamResult(getBaos());

    // creamos un transformador y hacemos la transformacion
    Transformer transformer = templates.newTransformer();
    transformer.setErrorListener(new XsltErrorListener());

    if(this.getParametros()!=null && this.getParametros().size()>0){
      String nombre="";
      for (Enumeration enumer = this.getParametros().keys();enumer.hasMoreElements();){
          nombre=(String)enumer.nextElement();
          transformer.setParameter(nombre, this.getParametros().get(nombre));
      }
    }

    transformer.transform(xmlSource, result);

}

任何人都可以帮助我吗? 非常感谢提前!!!

1 个答案:

答案 0 :(得分:0)

使用 <xsl:number> format-number()将数字转换为您想要的特定格式的字符串。

更好的是,不要将字符串转换为数字然后再转换为字符串。直接拿原始字符串。

如果您的数字不是整数,那么XSLT / XPath不能保证在将数字隐式转换为字符串时数字格式是什么。考虑到您的号码代表金钱,您应该假设这样,并寻找一种方法来确保您的号码将如何格式化。它只会在你没有在外面测试的特定情况下做你所假设的。虽然我同意你的图书馆的格式化策略是令人惊讶的,但是无论XSLT库和你的代码如何,都会有大量的案例会导致糟糕的结果。您正在输出金额,明确指定数字格式。在计算中总是如此。

已编辑:格式化数字的正确方法除外format-number()<xsl:number>有不同的目的。