gpt4 book ai didi

java - XSL 在 unix 中与 xsltproc 一起工作正常,但在 java 代码中使用时则不行

转载 作者:行者123 更新时间:2023-12-01 11:25:17 25 4
gpt4 key购买 nike

我有一个如图所示的 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 文件中的公共(public)记录,其记录格式如下:

<?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)

最佳答案

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

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

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

因此,要么 XSLTC 有错误(选项 1:可能),要么您的 Java 版本的字节代码 validator 拒绝有效的字节代码(选项 2:不太可能)。

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

java -Xverify:none ...

关闭字节码 validator 。如果成功,则选项 2 为真。

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

关于java - XSL 在 unix 中与 xsltproc 一起工作正常,但在 java 代码中使用时则不行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30866883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com