我試圖運行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中的嵌入式轉換器很糟糕。這是這個例子嗎?
我將Saxon-HE v9添加到了我的項目中,並且按預期工作。所以它似乎是嵌入在Java中的變壓器導致了問題。 – PeteBrew 2014-11-03 21:59:34
@PeteBrew很高興你的工作! – 2014-11-03 22:16:16
感謝@MathiasMuller的指針,但我仍然不明白爲什麼它沒有撒克遜不工作。 – PeteBrew 2014-11-03 22:45:12