【问题标题】:Efficient XSLT pipeline, with params, in Java高效的 XSLT 管道,带有参数,在 Java 中
【发布时间】:2010-08-18 22:46:35
【问题描述】:

此问题的最佳答案描述了一种在 Java 中实现高效 XSLT 管道的技术:

Efficient XSLT pipeline in Java (or redirecting Results to Sources)

不幸的是,虽然 Transformer 似乎公开了一个用于设置 XSLT 参数的 API,但这似乎没有任何效果。例如,我有以下代码:

Transformer.java

import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.Templates;
import javax.xml.transform.sax.TransformerHandler; 
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.Transformer;
import java.io.File;
public class MyTransformer {
    public static void main(String[] args) throws javax.xml.transform.TransformerConfigurationException, javax.xml.transform.TransformerException{
        SAXTransformerFactory stf = (SAXTransformerFactory)TransformerFactory.newInstance();

        // These templates objects could be reused and obtained from elsewhere.
        Templates templates1 = stf.newTemplates(new StreamSource( new File("MyStylesheet1.xslt")));
        Templates templates2 = stf.newTemplates(new StreamSource(new File("MyStylesheet2.xslt")));

        TransformerHandler th1 = stf.newTransformerHandler(templates1);
        TransformerHandler th2 = stf.newTransformerHandler(templates2);

        th1.setResult(new SAXResult(th2));
        th2.setResult(new StreamResult(System.out));

        Transformer t = stf.newTransformer();

            //SETTING PARAMETERS HERE
        t.setParameter("foo","this is from param 1");
        t.setParameter("bar","this is from param 2");

        t.transform(new StreamSource(new File("in.xml")), new SAXResult(th1));

        // th1 feeds th2, which in turn feeds System.out.
    }
}

MyStylesheet1.xslt

<?xml version="1.0"?>
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform"  xmlns:foo="urn:foo" version="1.0">
    <output method="xml"/>

    <param name="foo"/>

    <template match="@*|node()">
        <copy>
            <apply-templates select="@*|node()"/>
        </copy>
    </template>

    <template match="foo:my/foo:hello">
        <copy>
            <foo:world>
                foo is : <value-of select="$foo"/>
            </foo:world>
        </copy>

    </template>
</stylesheet>

MyStylesheet2.xslt

<?xml version="1.0"?>
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:foo="urn:foo" version="1.0">
    <output method="xml"/>

    <param name="bar"/>

    <template match="@*|node()">
        <copy>
            <apply-templates select="@*|node()"/>
        </copy>
    </template>

    <template match="foo:my/foo:hello/foo:world">
        <copy>
            <apply-templates select="@*|node()"/>

            <attribute name="attr">
                <value-of select="$bar"/>
            </attribute>
        </copy>

    </template>
</stylesheet>

in.xml

<my xmlns="urn:foo">
    <hello/>
</my>

这给了我以下输出:

<?xml version="1.0" encoding="UTF-8"?><my xmlns="urn:foo">
        <hello><foo:world xmlns:foo="urn:foo">foo is : </foo:world></hello>
</my>

你可以看到 foo:world/@attr 是空的,而 foo:world 的文本内容是“foo is:”。预期的行为是它们应该已经被传递给 setParameter 方法的参数填充。

有没有办法使用这种技术来设置 XSL 转换参数。如果没有,谁能推荐一种在 Java 中有效地转换样式表的替代技术,例如也可以设置 XSLT 参数?

【问题讨论】:

    标签: java dom sax pipeline xslt


    【解决方案1】:

    问题是每个 TransformerHandler 都有一个与之关联的单独的 Transformer。您的第二个模板存在问题,但由于这是一个示例,我想这并不重要。你想要:

    //SETTING PARAMETERS HERE
    th1.getTransformer().setParameter("foo","this is from param 1");
    th2.getTransformer().setParameter("bar","this is from param 2");
    

    请注意,您也不需要创建第三个转换器,您可以在 th1.getTransformer() 上启动转换链

    【讨论】:

      【解决方案2】:

      与最后一个音符有关。 在 th1.getTransformer() 上调用 transform() 并且结果再次指向 th1 是不正确的。它将被处理两次。 使用 new Transformer() 就像在最初的帖子中显示的那样是正确的方法。

      t.transform(new StreamSource(new File("in.xml")), new SAXResult(th1));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-22
        • 2019-10-04
        • 1970-01-01
        • 2020-09-10
        • 2016-06-23
        • 1970-01-01
        • 2021-11-10
        相关资源
        最近更新 更多