SaxonApiException: 轴步骤 ./CLIENT 的上下文项不存在 [英] SaxonApiException: The context item for axis step ./CLIENT is absent

查看:53
本文介绍了SaxonApiException: 轴步骤 ./CLIENT 的上下文项不存在的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在 saxon/java 中使用 XSLT 2.0 将 XML 转换为 XML.我正在使用我在堆栈溢出线程使用 XSLT 为简单 XML 应用 Muenchian 分组"中找到的示例 XML

I am trying to convert and XML to an XML using XSLT 2.0 in saxon/java. I am using a sample XML I found on stack overflow thread "Applying Muenchian grouping for a simple XML with XSLT"

但是我收到一个错误:XPDY0002:轴步骤 ./CLIENT 的上下文项不存在.

However I am getting an error : XPDY0002: The context item for axis step ./CLIENT is absent.

我的测试 XSL:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">

<xsl:output omit-xml-declaration="no" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:template match="CLIENTS" name="main">
<CLIENTS>
  <xsl:for-each-group select="CLIENT" group-by="NAME">
  <xsl:comment><xsl:value-of select="current-grouping-key()"/>         </xsl:comment>
    <CLIENT>
      <xsl:sequence select="NAME" />
      <xsl:for-each select="current-group()">
        <ACCOUNT>
          <xsl:sequence select="*[not(self::NAME)]" />
        </ACCOUNT>
      </xsl:for-each>
    </CLIENT>
  </xsl:for-each-group>
 </CLIENTS>
</xsl:template>

</xsl:stylesheet>

我的测试 XML:

<CLIENTS>
 <CLIENT>
<NAME>John</NAME>
<ACCOUNT_NUMBER>1424763562761</ACCOUNT_NUMBER>
<LAST_USED>2012-10-03</LAST_USED>
<AMOUNT>5000</AMOUNT>
</CLIENT>
<CLIENT>
<NAME>John</NAME>
<ACCOUNT_NUMBER>543667543732</ACCOUNT_NUMBER>
<LAST_USED>2012-10-02</LAST_USED>
<AMOUNT>10000</AMOUNT>
</CLIENT>
</CLIENTS>

我的 Java(适用于其他转换):

My Java ( which works with other transforms) :

void xmlXSLTParser(){

String xslFile = commonPath + "/xslt/inputPointCSVTOXML_style2.xsl";
String inputFile = "file:///" + commonPath + pointWorkFile;
String outputFile = commonPath + pointWorkFile + ".final";

try {
    Processor proc = new Processor(false);
    XsltCompiler comp = proc.newXsltCompiler();
    XsltExecutable exp = comp.compile(new StreamSource(new   File(xslFile)));
    Serializer out = new Serializer();
    out.setOutputProperty(Serializer.Property.METHOD, "xml");
    out.setOutputProperty(Serializer.Property.INDENT, "yes");
    out.setOutputFile(new File(outputFile));

    XsltTransformer trans = exp.load();
    trans.setInitialTemplate(new QName("main"));
    //trans.setParameter(new QName("url-of-csv"),new  XdmAtomicValue(inputFile));
    trans.setDestination(out);
    trans.transform();

    System.out.println("Output written to text file");
} catch (SaxonApiException e) {
    println("XSLT Error :" + e );
}
}

}

我的错误详情:

Error at char 6 in xsl:for-each-group/@select on line 10 column 59 of    inputPointCSVTOXML_style2.xsl:

XPDY0002: The context item for axis step ./CLIENT is absent
XSLT Error :net.sf.saxon.s9api.SaxonApiException: The context item for      axis step ./CLIENT is absent

推荐答案

您的 Java 代码没有设置任何上下文项,而是设置了一个初始模板.因此,您需要确保使用 http://saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/XsltTransformer.html#setInitialContextNode(net.sf.saxon.s9api.XdmNode) 或作为 Source,使用 http://saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/XsltTransformer.html#setSource(javax.xml.transform.Source).

Your Java code does not set any context item, instead it sets an initial template. So you will need to make sure you provide the input XML as the context item to the XsltTransformer, using http://saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/XsltTransformer.html#setInitialContextNode(net.sf.saxon.s9api.XdmNode) or as a Source, using http://saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/XsltTransformer.html#setSource(javax.xml.transform.Source).

所以代替 trans.setInitialTemplate(new QName("main")); 使用 trans.setSource(new StreamSource(inputFile));.

这篇关于SaxonApiException: 轴步骤 ./CLIENT 的上下文项不存在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆