标签: xalan

如何告诉xalan不要验证使用"document"函数检索的XML?

昨天甲骨文决定取消java.sun.com一段时间.这对我来说很麻烦,因为xalan试图验证一些XML但无法检索properties.dtd.

我正在使用xalan 2.7.1来运行一些XSL转换,我不希望它验证任何东西.所以尝试像这样加载XSL:

SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
spf.setValidating(false);
XMLReader rdr = spf.newSAXParser().getXMLReader();      
Source xsl = new SAXSource(rdr, new InputSource(xslFilePath));  
Templates cachedXSLT  = factory.newTemplates(xsl);
Transformer transformer = cachedXSLT.newTransformer();         
transformer.transform(xmlSource, result);  
Run Code Online (Sandbox Code Playgroud)

在XSL本身,我做这样的事情:

  <xsl:variable name="entry" select="document(concat($prefix, $locale_part, $suffix))/properties/entry[@key=$key]"/>
Run Code Online (Sandbox Code Playgroud)

此代码检索的XML在顶部具有以下定义:

<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="...
Run Code Online (Sandbox Code Playgroud)

尽管上面的java代码指示解析器不是VALIDATE,但它仍然向java.sun.com发送请求.虽然java.sun.com不可用,但这会使转换失败并显示以下消息:

 Can not load requested doc: http://java.sun.com/dtd/properties.dtd
Run Code Online (Sandbox Code Playgroud)

如何让xalan停止尝试验证从"document"函数加载的XML?

java xml validation xalan

6
推荐指数
1
解决办法
5256
查看次数

org.apache.xalan.processor.TransformerFactoryImpl上的AbstractMethodError

使用以下代码:

private Document transformDoc(Source source) throws TransformerException, IOException {
    TransformerFactory factory = TransformerFactory.newInstance();
    factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
    factory.setFeature("http://xml.org/sax/features/validation", false);

    Transformer xslTransformer =
            factory.newTransformer(new StreamSource(pdfTransformXslt.getInputStream()));
    JDOMResult result = new JDOMResult();
    xslTransformer.transform(source, result);
    return result.getDocument();
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

java.lang.AbstractMethodError: org.apache.xalan.processor.TransformerFactoryImpl.setFeature(Ljava/lang/String;Z)V
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

这是我的Maven依赖树:

   ------------------------------------------------------------------------
   Building mc-hub-batch
      task-segment: [dependency:tree]
   ------------------------------------------------------------------------
   snapshot com.billmelater:mc-test-support:2.0.0.11-SNAPSHOT: checking for updates from repository.jboss.org
   [dependency:tree {execution: default-cli}]
   com.billmelater:mc-hub-batch:jar:2.0.0.11-SNAPSHOT
   +- com.billmelater:mc-hub-core:jar:2.0.0.11-SNAPSHOT:compile
   |  +- commons-lang:commons-lang:jar:2.4:compile
   |  +- commons-collections:commons-collections:jar:3.2.1:compile
   |  +- commons-beanutils:commons-beanutils:jar:1.8.0:compile
   |  +- commons-digester:commons-digester:jar:2.0:compile
   |  |  +- (commons-beanutils:commons-beanutils:jar:1.8.0:compile - omitted for duplicate)
   |  |  \- (commons-logging:commons-logging:jar:1.1.1:compile …
Run Code Online (Sandbox Code Playgroud)

java xslt xalan

5
推荐指数
1
解决办法
6195
查看次数

java.io.IOException:服务器返回HTTP响应代码:503为URL:http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd

在以下代码中:

private Document transformDoc(Source source) throws TransformerException, IOException {
    TransformerFactory factory = TransformerFactory.newInstance();

    Transformer transformer =
            factory.newTransformer(new StreamSource(xsltResource.getInputStream()));
    JDOMResult result = new JDOMResult();
    transformer.transform(source, result);
    return result.getDocument();
}
Run Code Online (Sandbox Code Playgroud)

我得到这个例外:

java.io.IOException: Server returned HTTP response code: 503 for URL: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
Run Code Online (Sandbox Code Playgroud)

我通过xsl翻译的XHTML是:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
  <title>Terms and Conditions</title>
</head>
<body>
  <div>Test Content</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

如何阻止xalan变压器打电话回家?

java xslt xhtml xalan

5
推荐指数
1
解决办法
4843
查看次数

JAXP XSLT document()函数问题

我在使用XSLT转换的java应用程序下工作.我有很多document()调用,所以有可能有java.lang.OutOfMemory异常(我实际上有),因为在每次调用document()函数之后,文档都会被缓存.

http://xml.apache.org/xalan-j/faq.html#faq-N102F9,我读到可以增加堆内存大小,这在我的情况下不是解决方案.我也尝试使用似乎不支持的增量变换.

那么,有没有可能在使用document()函数时关闭jaxp中的文档缓存?

java xml xslt jaxp xalan

5
推荐指数
1
解决办法
691
查看次数

在XSLT中对记录进行分组时如何避免O(n ^ 2)的复杂性?

当XSL将大量数据转换为HTML时,我经常遇到性能问题.这些数据通常只是几个非常大的表,大致有这种形式:

<table>
  <record>
    <group>1</group>
    <data>abc</abc>
  </record>
  <record>
    <group>1</group>
    <data>def</abc>
  </record>
  <record>
    <group>2</group>
    <data>ghi</abc>
  </record>
</table>
Run Code Online (Sandbox Code Playgroud)

在转换过程中,我希望在视觉上对这些记录进行分组

+--------------+
| Group 1      |
+--------------+
|   abc        |
|   def        |
+--------------+
| Group 2      |
+--------------+
|   ghi        |
+--------------+
Run Code Online (Sandbox Code Playgroud)

这是一个愚蠢的实现(设置来自http://exslt.org.实际的实现有点不同,这只是一个例子):

<xsl:for-each select="set:distinct(/table/record/group)">
  <xsl:variable name="group" select="."/>

  <!-- This access needs to be made faster : -->
  <xsl:for-each select="/table/record[group = $group]">
    <!-- Do the table stuff -->
  </xsl:for-each>
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)

很容易看出这往往会有O(n^2)复杂性.更糟糕的是,因为每个记录中都有很多字段.操作的数据可以达到几十MB,记录的数量可以达到5000.在最坏的情况下,每个记录都有自己的组和50个字段.而且为了使事情变得更糟,还有另一层次的分组可能就是这样O(n^3)

现在会有很多选择:

  1. 我可以找到一个涉及地图和嵌套数据结构的Java解决方案.但我想提高我的XSLT技能,所以这实际上是最后一个选择.
  2. 我可能忘记了Xerces/Xalan/Exslt中的一个很好的功能,可以更好地处理分组
  3. 我可以建立某种索引 /table/record/group
  4. 你可以向我证明,<xsl:apply-templates/>在这个用例中,这种 …

java xslt performance xerces xalan

5
推荐指数
1
解决办法
259
查看次数

Xalan XSLT - 内存堆空间不足

我的项目有一个报告模块,它以 XML 的形式从数据库收集数据,并在其上运行 XSLT 以生成用户所需的报告格式。此时的选项是 HTML 和 CSV。

我们使用 Java 和 Xalan 与数据进行所有交互。

不好的部分是用户可以请求的这些报告之一仅为 XML 部分的 143MB(大约 430,000 条记录)。将其转换为 HTML 时,我用尽了堆空间,最多为堆保留了 4096G。这是无法接受的。

看来问题简直是数据太多了,但我不禁想到,除了限制客户,无法满足功能需求之外,还有更好的处理方式。

我很高兴根据需要提供更多信息,但我不能透露太多关于该项目的信息,因为我相信你们大多数人都理解。此外,答案是肯定的;我同时需要所有数据:我无法对其进行分页。

谢谢

编辑

我使用的所有转换类都在 javax.xml.transform 包中。实现如下所示:

final Transformer transformer = 
  TransformerFactory.newInstance().newTransformer(
    new StreamSource(new StringReader(xsl)));
final StringWriter outWriter = new StringWriter();
transformer.transform(
  new StreamSource(new StringReader(xml)), new StreamResult(outWriter));
return outWriter.toString();
Run Code Online (Sandbox Code Playgroud)

如果可能,我希望 XSLT 保持原样。StreamSource做事的方法应该允许我在处理一些数据时对它进行 GC,但我不确定 XSLT(函数等)有哪些限制,这可能需要它进行适当的清理。如果有人可以向我指出详细说明这些限制的资源,那将非常有帮助。

java xslt heap xalan

5
推荐指数
1
解决办法
3840
查看次数

遍历使用xalan:nodeset获得的节点集时,xsl:key不起作用

我发现xsl:key似乎无法正常工作的情况。
我正在将XSLT 1与Xalan(已编译)一起使用,这就是发生的情况:

1.-这有效:名为test1的键可以正常工作:

<xsl:variable name="promosRTF">
  <xsl:copy-of select="promo[@valid='true']"/>
</xsl:variable>
<xsl:variable name="promos" select="xalan:nodeset($promosRTF)" />

<!-- now the key: when defined and used here it works fine: -->
<xsl:key name="test1" match="//promo" use="'anytext'" />
<xsl:for-each select="key('test1','anytext')/*">
  loop through elements in key... ok, works fine
</xsl:for-each>

<xsl:for-each select="$promos/*">
  ..loop through elements in variable $promos ...it is not empty so the loop iterates several times
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)

2.-这不起作用:现在在循环遍历xalan:nodeset获得的元素的循环内定义并使用了密钥test1(我想这是重点)。

<xsl:variable name="promosRTF">
  <xsl:copy-of select="promo[@valid='true']"/>
</xsl:variable>
<xsl:variable name="promos" select="xalan:nodeset($promosRTF)" />

<xsl:for-each …
Run Code Online (Sandbox Code Playgroud)

xslt xalan xslkey xslt-1.0

5
推荐指数
1
解决办法
1813
查看次数

在安全模式下使用 Xalan 执行 XSLT 以创建 XHTML 在创建属性时抛出 TransformerConfigurationException

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

相关的更改文件在这里:http : //svn.apache.org/viewvc/xalan/java/branches/xalan-j_2_7_1_maint/src/org/apache/xalan/processor/XSLTElementProcessor.java?r1=1359736&r2=1581058&pathrev=15810format =h

请参阅以下示例:

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 = …
Run Code Online (Sandbox Code Playgroud)

java xslt xalan

5
推荐指数
1
解决办法
1601
查看次数

如何设置 javax.xml.transform.TransformerFactory 系统属性

我正在使用它javax.xml.transform.Transform来将 XML 文件转换为 PDF。这本身工作得很好,但该项目的某些部分正在使用 Xalan,它实现了自己的TransformerFactory,并且其中的某些内容不适用于西里尔语。

我在https://xml.apache.org/xalan-j/usagepatterns.html发现有一个属性用于定义使用的工厂:

TransformerFactory 是一个抽象类,具有静态 newInstance() 方法,该方法实例化由 javax.xml.transform.TransformerFactory 系统属性指定的具体子类。

此系统属性的默认设置是 org.apache.xalan.processor.TransformerFactoryImpl。

我的问题是:如何设置此属性以不使用 Xalan?

java xsl-fo xalan xslt-1.0

5
推荐指数
1
解决办法
7029
查看次数

java.lang.ClassNotFoundException:将 xalan 升级到 2.7.3 后抛出 org.apache.xml.serializer.OutputPropertiesFactory

我有java代码将一些数据导出到excel文件中。(我只在下面包含了我认为代码中的相关部分)

一切工作正常,但后来我将 xalan 从 2.7.2 升级到 2.7.3,它停止工作。原因 - java.lang.ClassNotFoundException: org.apache.xml.serializer.OutputPropertiesFactory

异常在“wb.write(fileOutputStream);”处引发 export() 方法下的行

import org.apache.logging.log4j.Level;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
     
private Workbook wb;

            private void init(String targetPath, String fileName, ExcelExportType exportType) {
                exportedFile = new File(Paths.get(targetPath, fileName  + FILE_EXTENSION).toString());
                try {
                    fileOutputStream = new FileOutputStream(exportedFile);
                    // if file doesn't exists, then create it
                    if (!exportedFile.exists()) {
                        exportedFile.createNewFile();
                    }
                } catch (Exception e) {
                    throw new RuntimeException("Init failed. File " + exportedFile.getName() + " cannot be found");
                }
        
                switch (exportType) …
Run Code Online (Sandbox Code Playgroud)

java excel xalan

5
推荐指数
1
解决办法
3657
查看次数

标签 统计

xalan ×10

java ×9

xslt ×7

xml ×2

xslt-1.0 ×2

excel ×1

heap ×1

jaxp ×1

performance ×1

validation ×1

xerces ×1

xhtml ×1

xsl-fo ×1

xslkey ×1