2014-11-03 77 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