Java XSLT无法按预期工作

时间:2014-11-03 19:53:56

标签: java xslt namespaces

我试图在Java中运行XSL转换来更改某些XML文件上的命名空间URI。经过一些研究,我得出了以下XSL:

<?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 个答案:

答案 0 :(得分:1)

  

Java或我的XSL中存在问题吗?

您的XSLT样式表适用于Saxon 6.5,Saxon 9.5和Xalan 2.7。您确定将完全此样式表应用于完全此输入吗?

  

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

我确信它有问题。这并不一定意味着您的Java代码是错误的,但实现可能在某处错误,并且运行时异常可能是由实际错误引起的。