使用net.sf.saxon.TransformerFactoryImpl进行XSLT 2.0验证失败

时间:2014-09-20 12:20:12

标签: xslt-2.0

我有以下示例来验证xslt样式表。在各种论坛中,有人提到我们应该" net.sf.saxon.TransformerFactoryImpl"对于xslt 2.0样式表。据我更新了我的代码。但是这段代码只适用于少数情况。例如,代码不适用于我在下面附加的示例。如果我将样本表样式更改为1(版本=" 1.0"),则代码可以正常工作。否则它会失败。我相信样本样式表是有效的xslt 2.0文档。

这引起了很多问题,如何在解析之前验证样式表?

   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();
        }
}
}

我的Sample 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>

1 个答案:

答案 0 :(得分:0)

您的样式表调用了名称空间bpws:getVariableData中名为http://schemas.xmlsoap.org/ws/2003/03/business-process/的函数,但该函数没有定义,因此您会收到编译错误。您需要使用xsl:functionxsl:import/include定义该函数的模块来定义该函数。