Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在安全模式下使用Xalan执行XSLT以创建XHTML,并在创建属性时抛出TransformerConfiguration异常_Java_Xslt_Xalan - Fatal编程技术网

Java 在安全模式下使用Xalan执行XSLT以创建XHTML,并在创建属性时抛出TransformerConfiguration异常

Java 在安全模式下使用Xalan执行XSLT以创建XHTML,并在创建属性时抛出TransformerConfiguration异常,java,xslt,xalan,Java,Xslt,Xalan,我试图在安全模式下使用Xalan(2.7.2)的更新版本,但遇到了无法理解未知属性的问题。 问题是,它阻止您使用任何发出XHTML的样式表(在安全处理模式下),因为它不允许“th”元素的“colspan”属性 相关的更改文件位于此处: 请参见以下示例: import javax.xml.XMLConstants; import javax.xml.transform.*; import javax.xml.transform.stream.StreamSource; import java.io

我试图在安全模式下使用Xalan(2.7.2)的更新版本,但遇到了无法理解未知属性的问题。 问题是,它阻止您使用任何发出XHTML的样式表(在安全处理模式下),因为它不允许“th”元素的“colspan”属性

相关的更改文件位于此处:

请参见以下示例:

import javax.xml.XMLConstants;
import javax.xml.transform.*;
import javax.xml.transform.stream.StreamSource;
import java.io.StringReader;

public class XalanSecureAttributeRepro {
    private static final String XSL =
            "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n" +
            "  <xsl:output method=\"html\"/>\n" +
            "  <xsl:template match=\"/*\">\n" +
            "    <th colspan=\"2\"/>\n" +
            "  </xsl:template>\n" +
            "</xsl:stylesheet>";

    public static void main( String[] args ) throws Exception {
        System.setProperty( "javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl" );

        TransformerFactory tf = TransformerFactory.newInstance();
        tf.setFeature( XMLConstants.FEATURE_SECURE_PROCESSING, true);
        tf.setErrorListener( new DefaultErrorHandler( true ) );

        final Source source = new StreamSource( new StringReader( XSL ) );
        Templates templates = tf.newTemplates( source ); // throws:
                        // TransformerException: "colspan" attribute is not allowed on the th element!
    }
}

我是否对样式表做了一些错误的事情,或者我是否缺少在transformer factory上设置一个特性。如何使用Xalan转换在安全处理模式下发出(X)HTML的样式表?

引用的Xalan源版本中有问题的行是:

if(attrDef.getName().compareTo("*")==0 && handler.getStylesheetProcessor().isSecureProcessing())
我不能100%确定
attrDef
中有什么,但我猜这是您的属性,它永远不会有
*
的值(但是从
XSLTAttributeDef
上的文档来看,值
*
是允许的,但我不知道如何使用,因为它不是qname)

仅限制单个元素上的属性数量,但限制很高,为10000


在我看来,您遇到了Xalan 2.7.1的一个bug。它阻止您使用任何属性。如果因为只能使用已知属性而施加限制,那么这似乎仍然是一个bug,因为
th
允许在HTML和XHTML中将
colspan
作为属性。但是,如果您将输出从
HTML
更改为
XML

时看到相同的行为,您可以尝试,这是一个在Xalan-2.7.2_3中解决的错误,等待将来的完整版本

<dependency>
    <groupId>org.apache.servicemix.bundles</groupId>
    <artifactId>org.apache.servicemix.bundles.xalan</artifactId>
    <version>2.7.2_3</version><!--$NO-MVN-MAN-VER$-->
</dependency>

org.apache.servicemix.bundles
org.apache.servicemix.bundles.xalan
2.7.2_3

使用
可以防止重写。

您的样式表看起来不错。为什么需要在安全处理模式下运行转换?我需要在安全处理模式下运行转换,因为我们的软件可以处理来自未知(不受信任)源的样式表,因此我们需要许多安全模式保护。为什么不在不太安全的正常模式下运行此特定样式表?你已经写好了,所以你知道会发生什么。为什么必须在同一模式下处理所有样式表?上面的样式表是用于演示此问题的示例样式表。在我们的应用程序中,我们允许用户使用他们提供的样式表转换xml。因此,我们不能信任此样式表,因此需要在安全处理模式下运行转换。我想知道Xalan是只抱怨未知属性,还是像Abel在回答中建议的那样抱怨任何属性?如果只是未知的,那么你不能用修改过的文档类型定义或者其他什么让他们知道吗?我只是尝试用xml作为输出方法,但没有成功。我开始觉得它像个虫子。如果不能使用属性,那么它就不是很有用。我已将其提交到xalan邮件列表,如果收到回复,将进行更新。@kazvictor您是否确实在任何属性上获得相同的错误行为,即使不创建HTML根标记?看起来确实是个大错误。也许您可以尝试早期构建?是的,这似乎是任何属性的问题。上面的示例样式表只是复制问题的最小样式表。这看起来像是由这个特定的更改引起的,我相信它在之前的版本中是有效的:XalanJ项目中提出了一个问题来跟踪这个bug:@Abel-你不是说“Xalan 2.7.2的bug”吗?
<dependency>
    <groupId>org.apache.servicemix.bundles</groupId>
    <artifactId>org.apache.servicemix.bundles.xalan</artifactId>
    <version>2.7.2_3</version><!--$NO-MVN-MAN-VER$-->
</dependency>