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

2023-12-06

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

Java 中的高效 XSLT 管道(或将结果重定向到源)

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

变压器.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 参数吗?


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 中带有参数的高效 XSLT 管道 的相关文章

随机推荐

  • SQL:ORDER BY 两列混合,不基于优先级

    我正在使用 mySQL 我必须按姓氏对联系人姓名进行排序 但如果没有姓氏 我会按名字排序 这看起来像 ORDER BY lastname lastname firstname 然而 这使得带有姓氏的出现在顶部 我想要的行为是将名字和姓氏混合
  • 示例函数中的替换是什么意思? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 当我尝试从数据框中随机选择每组中的 10 个样本时 我试图弄清楚样本函数的工作原理 我有一个 5 列和 7000 行的数据框 我将数据集分成大约 200 个组 然后我想从每组
  • 在 UIButton 的选择器上传递参数

    我有一个detailDisclousurea 的标注上的按钮MKAnnotation 当按下此按钮时 我需要调用一个传递标识参数的方法annotation那叫它 怎么可能呢 这是我的注释视图 MKAnnotationView mapView
  • 如何使用 Git 恢复

    How is git revert used 这可能听起来像是一个重复的问题 但当人们问这个问题时 答案通常是 使用git reset as per 恢复到 Git 中 SHA 哈希的提交 然后当有人问如何使用时git reset人们回复说
  • 车把和异步调用

    我使用这个助手来检查图像是否存在 Handlebars registerHelper checkLogo function url UrlExists url function status if status 200 return new
  • Delphi w Indy 10:无法通过 Web 服务器上的 SSL“最佳实践”通过 TLS 1.2 连接

    问题 我们如何让 Indy 10 与强制执行最新 TLS 1 2 SSL 最佳实践的 Web 服务器配合使用 Microsoft 记录了最佳实践 https technet microsoft com library security ms
  • AvalonDock 现在失去 Alt 键装饰

    I ve been using AvalonDock 2 0 for some time now being key for managing documents in an IDE In the last month or so I ve
  • 如何给物体的旋转设置2个限制?

    当按住 D 向上 W 向下时 我需要使对象在 z 轴上旋转 但限制两个方向的旋转 使用下面提供的代码 我设法使对象在按下时旋转 但它不会停止当达到我的变量设置的两个限制中的任何一个时旋转 我是编码领域的新手 希望您能帮助我解决和理解我的问题
  • 最快的素性测试

    您能否建议一种可在实践中使用的快速 确定性方法来测试大数是否为素数 另外 我想知道如何正确使用非确定性素性测试 例如 如果我使用这样的方法 如果输出为 否 我可以确定一个数字不是素数 但是当输出为 可能 时 其他情况又如何呢 在这种情况下我
  • 为什么我的 Realm 对象不保存存储的值?

    我正在四处寻找一种解决方案 以在我的一个应用程序中实现小型离线数据存储 该解决方案使用起来既简单又快捷 无论如何 我遇到了Realm去做这个 但是 我遇到一个问题 每次启动应用程序时 数据库中的内容都是空的 我完成所有分配并调用开始写事务方
  • 在 R 中将星期几从整数转换为字符串

    我有一个数据集 其中包含一周中的事件数字 1 7 1 是星期一 7 是星期日 我已将其转换为用户可以理解的星期几 星期一 星期二等 只需将该行中的每个 1 实例替换为星期一 等 即可 有没有一个图书馆可以更干净地为我做这件事 set see
  • Django storages S3 - 存储现有文件

    我有 django 1 11 和最新的 django storages 使用 S3 后端进行设置 我正在尝试使用 AWS 图像链接作为起点 以编程方式实例化图像文件 我无法弄清楚如何通过查看源代码 文档来做到这一点 我假设我需要创建一个文件
  • 来自 cv::solvePnP 的世界坐标中的相机位置

    我有一个校准过的相机 固有矩阵和畸变系数 我想知道相机的位置 知道一些 3d 点及其在图像中的对应点 2d 点 我知道cv solvePnP可以帮助我 阅读后this and this我知道我的输出solvePnPrvec and tvec
  • 服务器端问题:PHP 将消息推送到黑莓

    我正在使用来自的客户端代码http supportforums blackberry com t5 BlackBerry Push Development Simplified BIS Push client sample ta p 693
  • getElementsByClassName 问题[重复]

    这个问题在这里已经有答案了 我目前遇到 getElementsByClassName 属性的问题 我有一个显示和隐藏功能 当您将鼠标悬停在产品上时会显示一个按钮点击这里我已经使用 getElementById 属性启用了此函数 但是由于我想
  • 如何在 Visual Studio 2015 中关闭解决方案范围分析?

    在我同事的 PC 上 Visual Studio 2015 有时会显示一条消息 检测到内存不足 解决方案范围内的分析已关闭 显示此消息后 一切都快得多 如何手动关闭此分析 Edit 是的 我使用 Resharper 但这不是我想要的 代码分
  • Pandas:如何创建一个简单的计数器来增加每 n 行?

    有没有办法创建一个每 n 行加一的计数器 示例 gt 计数器每 4 行增加 counter 0 1 1 1 2 1 3 1 4 2 5 2 6 2 7 2 8 3 9 3 我正在尝试df counter np arange len df 4
  • 如何控制绑定到 CustomObject 的 DataGridView 中的列类型?

    我在 C WinForms 应用程序中有一个 DataGridView 它在运行时 通过 Form Load 数据绑定到自定义对象 在 DataGridView 的设计视图中 我没有设置列 当表单加载时 将根据数据绑定到的自定义对象中的数据
  • 有负零吗?

    我正在编码简单的计算器只是为了开始 iPhone 开发 问题是我有一个 按钮 它应该通过执行一个简单的操作来否定已经放在屏幕上的任何内容 1 它工作正常 除非先前的输入是0 设想 屏幕空白或0 我点击 进行否定 然后当我点击例如9我希望它能
  • Java 中带有参数的高效 XSLT 管道

    这个问题的最佳答案描述了一种在 Java 中实现高效 XSLT 管道的技术 Java 中的高效 XSLT 管道 或将结果重定向到源 不幸的是 虽然 Transformer 似乎公开了一个用于设置 XSLT 参数的 API 但这似乎没有任何效