2016-08-21 39 views
2

我正嘗試使用saxon/java中的XSLT 2.0將XML轉換爲XML。我正在使用在堆棧溢出線程上找到的示例XML「使用XSLT爲簡單XML應用Muenchian分組」SaxonApiException:軸步驟./CLIENT的上下文項不存在

但是,我收到一個錯誤:XPDY0002:軸步驟./CLIENT的上下文項不存在。

我的測試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(這與其他轉換工作):

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 

回答

2

您的Java代碼沒有設置任何上下文項目,而是設置了初始模板。因此,您需要確保將輸入XML作爲上下文項提供給XsltTransformer,使用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)

因此,而不是trans.setInitialTemplate(new QName("main"));使用trans.setSource(new StreamSource(inputFile));

+0

哇。非常感謝它的工作! –