2014-09-20 152 views
0

我有下面的示例來驗證xslt樣式表。在各種論壇上都提到我們應該爲xslt 2.0樣式表「net.sf.saxon.TransformerFactoryImpl」。據我已更新我的代碼。但是這段代碼僅適用於少數情況。例如,該代碼不適用於我在下面附加的示例。如果我將示例樣式表版本更改爲1(版本=「1.0」),則代碼工作正常。否則失敗。我相信示例樣式表是有效的xslt 2.0文檔。XSLT 2.0驗證失敗,net.sf.saxon.TransformerFactoryImpl

這造成了很多問題,我如何在解析之前驗證樣式表?

package com.ibm.mq.id; 

    import javax.xml.transform.TransformerConfigurationException; 
    import javax.xml.transform.stream.StreamSource; 

    import net.sf.saxon.TransformerFactoryImpl; 

    public class xsltTransformationEx { 
/** 
* @param args 
*/ 
public static void main(String[] args) { 


     String path="C://Work//ex.xsl"; 
     TransformerFactoryImpl factory = new TransformerFactoryImpl(); 
     try 
     { 

      javax.xml.transform.Templates template = factory.newTemplates(new StreamSource(path)); 
      //VALIDATING XSLT is valid or not 
      //Transformer trans = factory.newTransformer(new StreamSource(path)); 

     template.newTransformer(); 
     } 
     catch(TransformerConfigurationException ex) 
     { 
      ex.printStackTrace(); 
     } 
} 
} 

我的樣品XSLT下面是:

<?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"> 
    <xsl:output indent="yes" method="xml"/> 
    <xsl:variable name="FamilyMembers"  select="bpws:getVariableData('HSPACT_FamlyNumbers')"></xsl:variable> 
    <xsl:template match="Molers_Output"> 
     <xsl:element name="Molers_Output"> 
      <!-- 
      <xsl:element name="row"> 
         <xsl:value-of select="row"/> 
      </xsl:element> 
      --> 
      <xsl:for-each select="row[Hosp_Acct_Num = $FamilyMembers/rows/row/normalize- space(HACCT_)]"> 
       <xsl:variable name="Account"><xsl:value-of select="Hosp_Acct_Num"></xsl:value-of></xsl:variable> 
       <xsl:element name="row"> 
        <xsl:for-each select="node()"> 
         <xsl:choose> 
          <xsl:when test="name()='Family_Num'"> 
           <xsl:element name="Family_Num"> 
            <xsl:value-of select="$FamilyMembers/rows/row[normalize-space(HACCT_) = $Account]/HAFAM_"/> 
           </xsl:element> 
          </xsl:when> 
          <xsl:otherwise> 
           <xsl:copy copy-namespaces="yes" inherit-namespaces="yes"> 
            <xsl:value-of select="current()"/> 
           </xsl:copy> 
          </xsl:otherwise> 
         </xsl:choose>   
        </xsl:for-each> 
       </xsl:element> 
      </xsl:for-each> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 
+0

你是什麼意思? – 2014-09-20 12:21:38

+0

嗨瓊失敗了。當我在eclipse中運行這個程序時,出現這個錯誤 – user3699153 2014-09-23 07:12:00

+0

ex.xsl:第6行第xsl列:xsl:變量出錯:XPST0017:第6行char 43上的XPath語法錯誤在{ ... bleData('HSPACT_FamlyNumber ...}: 無法找到名爲 的匹配1參數函數{http://schemas.xmlsoap.org/ws/2003/03/business-process/} getVariableData() javax .xml.transform.TransformerConfigurationException:無法編譯樣式表檢測到1個錯誤 \t在net.sf.saxon.PreparedStylesheet.prepare(PreparedStylesheet.java:176) \t atnet.sf.saxon.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java。 :139)at com.ibm.mq.id.xsltTransformationEx.main(xsltTransformationEx.ja – user3699153 2014-09-23 07:16:13

回答

0

你的樣式表有一個命名空間中的http://schemas.xmlsoap.org/ws/2003/03/business-process/名爲bpws:getVariableData函數的調用,但該功能沒有定義,讓你得到一個編譯錯誤。您需要使用xsl:functionxsl:import/include定義該功能的模塊來定義該功能。