【问题标题】:XSLT 2.0 validation fails with net.sf.saxon.TransformerFactoryImplXSLT 2.0 验证因 net.sf.saxon.TransformerFactoryImpl 失败
【发布时间】:2014-09-20 12:20:11
【问题描述】:

我有以下示例来验证 xslt 样式表。在各种论坛中都提到我们应该为 xslt 2.0 样式表使用“net.sf.saxon.TransformerFactoryImpl”。根据我已经更新了我的代码。但是这段代码只适用于少数情况。例如,该代码不适用于我在下面附加的示例。如果我将示例样式表版本更改为 1 (version="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();
        }
}
}

下面是我的示例 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>

【问题讨论】:

  • 失败是什么意思?
  • 嗨,Jean 失败了 .. 当我在 Eclipse 中运行这个程序时,我收到了这个错误
  • xsl 错误:ex.xsl 的第 6 行第 93 列的变量:XPST0017:{...bleData('HSPACT_FamlyNumber...} 中第 6 行的第 43 行字符的 XPath 语法错误:找不到名为 {schemas.xmlsoap.org/ws/2003/03/business-process}getVariableData() javax.xml.transform.TransformerConfigurationException 的匹配 1 参数函数:无法编译样式表。检测到 1 个错误。在 net.sf.saxon.PreparedStylesheet.prepare(PreparedStylesheet.java:176) atnet .sf.saxon.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:139) at com.ibm.mq.id.xsltTransformationEx.main(xsltTransformationEx.ja
  • @Jean-FrançoisSavard 我刚刚更新了原始问题摘要,提供了更多详细信息

标签: xslt-2.0


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-30
    • 2011-06-05
    • 2010-11-27
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    相关资源
    最近更新 更多