XSL在unix中与xsltproc一起正常工作,但在java代码中使用时却没有

时间:2015-06-16 11:56:27

标签: java xml unix xslt

我有一个如图所示的XSL

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="no" indent="yes"/>
<xsl:param name="V9_XML_PATH" />
<xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

<xsl:template match="measSchedule">
<xsl:variable name="match" select="/schedule/scheduleItem[measurements/measurement=document($V9_XML_PATH)/schedule/scheduleItem/measurements/measurement]"/>
    <xsl:choose>
        <xsl:when test="$match">
            <xsl:copy-of select="$match"/>
        </xsl:when>
    </xsl:choose>
</xsl:template>
</xsl:stylesheet>

我使用它来查找2个XML文件中的常见记录,这些文件的记录格式如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<schedule>
  <scheduleItem scheduleId="1" startDate="2013-01-01" stopDate="2037-12-31">
    <measurements>
      <measurement>ADM010000</measurement>
    </measurements>
    <measPeriods>
      <period day="0" duration="0" hour="0" interval="15" minutes="0"/>
    </measPeriods>
  </scheduleItem>
  <!-- scheduleItem repeated n times -->
 </schedule>

这里基于字段/schedule/scheduleItem/measurements/measurement我正在处理2个文件的交集。

但问题是,当我在unix中执行此操作时:

xsltproc --stringparam V9_XML_PATH "/root/some/path/v9.xml" xsl.xslt v10.xml

它给出了正确的输出,但当我在我的Java程序中开始使用它时,我得到异常java.lang.VerifyError

java.lang.VerifyError: (class: GregorSamsa$0, method: test signature: (IIIILcom/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet;Lcom/sun/org/apache/xml/internal/dtm/DTMAxisIterator;)Z) Incompatible type for getting or setting field
    at GregorSamsa.template$dot$1()
    at GregorSamsa.applyTemplates()
    at GregorSamsa.applyTemplates()
    at GregorSamsa.transform()
    at com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet.transform(Unknown Source)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source)
    at com.project.net.converter.XMLConverter.convert(XMLConverter.java:122)

2 个答案:

答案 0 :(得分:1)

你的样式表显然是正确的。

当您使用Java运行转换时,它使用XSLTC,即与JDK捆绑在一起的XSLT引擎。 XSLTC解析您的样式表并动态生成Java字节代码,然后加载并运行以执行转换。

但不知何故,生成的XSLTC字节代码被Java VM拒绝,如java.lang.VerifyError所示。

因此,XSLTC有一个错误(选项1:可能),或者Java版本的字节码验证者拒绝有效的字节代码(选项2:不太可能)。

您可以尝试使用此JVM参数运行Java程序:

java -Xverify:none ...

转换字节码验证器。如果成功则选项2为真。

或者您可以尝试使用其他Java XSLT引擎。例如,试试Saxon;您可能只需要将saxon jar添加到类路径中,并且您的调用代码应该无需更改即可使用,因为您使用了java.xml.transform接口。如果成功,则选项1为真。

答案 1 :(得分:0)

这很可能是类路径错误。检查您没有多个JAR文件或目录,其中类文件提供了相同类的几次。