当前位置: 首页 > 面试题库 >

Java中具有参数的高效XSLT管道

姜学海
2023-03-14
问题内容

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

[Java中有效的XSLT管道(或将结果重定向到源)http://codingdict.com/questions/155853

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

变形金刚

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参数?


问题答案:

问题在于每个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()上启动转换链即可。



 类似资料:
  • 问题内容: 我有一系列相互配合的XSL 2.0样式表,即样式表A的输出提要B的提要C的提要。 最有效的方法是什么?改写的问题是:如何将一个转换的输出有效地路由到另一个转换。 这是我的第一次尝试: 如您所见,我正在使用DOM来进行转换之间的转换,尽管它很方便,但它并不是最佳的性能。 有没有简单的方法可以说,将SAXResult路由到SAXSource?StAX解决方案将是另一种选择。 我知道像XPr

  • 问题内容: 我有一系列相互配合的XSL 2.0样式表,即样式表A的输出提要B的提要C的提要。 最有效的方法是什么?改写的问题是:如何将一个转换的输出有效地路由到另一个转换。 这是我的第一次尝试: 如您所见,我正在使用DOM来进行转换之间的转换,尽管它很方便,但它并不是最佳的性能。 有没有简单的方法可以说,将SAXResult路由到SAXSource?StAX解决方案将是另一种选择。 我知道像XPr

  • 最近的一个问题,编译器是否允许用浮点乘法代替浮点除法,启发了我提出这个问题。 在严格要求代码转换后的结果应与实际除法运算在位上相同的情况下,很容易看出,对于二进制IEEE-754算法,除数为2的幂的除数也是可能的。只要除数的倒数是可表示的,乘以除数的倒数就会得到与除数相同的结果。例如,乘以0.5可以代替除以2.0。 然后,人们会想知道这种替换的其他除数还能起什么作用,假设我们允许任何替换除法但运行

  • 假设我有理由要求通过多个值类型快速查找类实例,为了便于解释,我将以游戏服务器为例。 假设服务器使用静态标识号处理用户。这个数字用于与特定玩家交流和互动(即:私聊、交易请求、战斗、公会邀请等)。 这需要经常使用玩家的识别号来查找玩家,根据我目前的经验,最好的方法是:(如果我错了,请纠正我。) 然而,在处理网络时,很多时候我还需要将播放器与网络会话关联,或者一些人可能更熟悉的“套接字”。看起来是这样的

  • 如果我从根节点开始,使用一个我要遍历的子节点列表,{“有机体”、“灵长类”、“人类”、“男性”、“John Smith”},然后递归处理一个步骤,并将剩余的子列表传递给子节点,返回这个。subnodes[MyList[0]].getSubnode(MyList.getRange(1,MyList.Count-1))...即使list.getRange()是一个浅层副本,它仍然会为每一级递归创建一个

  • 问题内容: spring框架使用的方法可以传递尽可能多的参数。 我想编写一个函数,它也可以接收无限量的数据。如何调用此功能,以便我可以阅读它。或如何定义它? 非常感谢。 问题答案: 它称为varargs。 它允许方法接受任意数量的参数。它们可以在方法中作为数组访问: 这是句法糖。编译器隐藏了数组的创建,因此而不是 你写