我试图运行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