2016-08-21 7 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コードではコンテキスト項目が設定されず、代わりに初期テンプレートが設定されます。そのため、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)を使用して、XsltTransformerのコンテキスト項目として入力XMLを提供する必要があります。

trans.setInitialTemplate(new QName("main"));の代わりにtrans.setSource(new StreamSource(inputFile));を使用してください。

+0

ワウ。多くのこと、それは働いてくれてありがとう! –

関連する問題