2014-11-03 64 views
1

我试图运行Java中的XSL转换来更改某些XML文件的命名空间URI。经过一些研究,我制定了以下XSL:Java XSLT按预期工作

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:tridasold="http://www.tridas.org/1.2.2" 
    xmlns:t="http://www.tridas.org/1.2.3" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

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

    <xsl:template match="@tridasold:*"> 
     <xsl:attribute name="t:{local-name()}"> 
      <xsl:value-of select="."/> 
     </xsl:attribute> 
    </xsl:template> 

    <xsl:template match="tridasold:*"> 
     <xsl:element name="t:{local-name()}"> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

我尝试过了上this and other online translator tools而这一切能够如我所料,这样,当我为它提供了以下非常简单的XML文件:

<project xmlns="http://www.tridas.org/1.2.2"> 
    <title>title0</title> 
</project> 

...它返回:

<t:project xmlns:t="http://www.tridas.org/1.2.3"> 
    <t:title>title0</t:title> 
</t:project> 

然而,当我尝试运行在Java中相同的翻译我越来越:

java.lang.RuntimeException: Namespace for prefix 't' has not been declared. 
at com.sun.org.apache.xalan.internal.xsltc.runtime.BasisLibrary.runTimeError(BasisLibrary.java:1603) 
at com.sun.org.apache.xalan.internal.xsltc.runtime.BasisLibrary.runTimeError(BasisLibrary.java:1607) 
at com.sun.org.apache.xalan.internal.xsltc.runtime.BasisLibrary.startXslElement(BasisLibrary.java:1490) 
at GregorSamsa.template$dot$2() 
at GregorSamsa.applyTemplates() 
at GregorSamsa.applyTemplates() 
at GregorSamsa.transform() 
at com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:617) 
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:748) 
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:359) 

是Java还是我的XSL问题?如果我从XSL文件中删除命名空间更改代码并添加一些非命名空间导向的更改,Java运行良好,所以我认为运行翻译的方式没有任何问题。

我在各种文章中看到过提及Java中的嵌入式转换器很糟糕。这是这个例子吗?

回答

1

是在Java或我的XSL的问题?

对于Saxon 6.5,Saxon 9.5和Xalan 2.7,您的XSLT样式表正常。你确定你的究竟是这个样式表到究竟是这个输入吗?

如果我从XSL文件中删除名称空间更改代码并添加了一些非面向命名空间的更改,Java运行良好,所以我认为运行该翻译的方式没有任何问题。

我确定它有问题。这并不一定意味着你的Java代码是错误的,但是实现可能会出错,并且运行时的怀疑可能是由一个实际的错误引起的。

+0

我将Saxon-HE v9添加到了我的项目中,并且按预期工作。所以它似乎是嵌入在Java中的变压器导致了问题。 – PeteBrew 2014-11-03 21:59:34

+0

@PeteBrew很高兴你的工作! – 2014-11-03 22:16:16

+0

感谢@MathiasMuller的指针,但我仍然不明白为什么它没有撒克逊不工作。 – PeteBrew 2014-11-03 22:45:12