无法在Java中找到转换器以动态替换现有XSLT文件的值,反之亦然

问题描述

有人可以向我提供使用Java对象动态替换现有XSLT文件的值的源代码

XSLT文件:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:apply-templates select="CheckDomainCmd"/>
    </xsl:template>

    <xsl:template match="CheckDomainCmd">
        <epp xmlns="urn:ietf:params:xml:ns:epp-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd">
            <command>
                <check>
                    <domain:check xmlns:domain="http://www.nic.cz/xml/epp/domain-1.4" xsi:schemaLocation="http://www.nic.cz/xml/epp/domain-1.4 domain-1.4.xsd">
                        <domain:name><xsl:value-of select="DomainName"/>.<xsl:value-of select="TLD" /></domain:name>
                    </domain:check>
                </check>
                <clTRID>
                    <xsl:value-of select="RIMTransactionID"/>
                </clTRID>
            </command>
        </epp>
    </xsl:template>
</xsl:stylesheet>

Java对象:

public class checkDomain {

    private String DomainName;
    private String TLD;
    private String RIMTransactionID;
    
    // getters and setters
}

我需要Java / spring中的源代码才能将值动态地放入XSLT select属性。 例如,在java对象中,我们具有以下值,以及如何将java对象值转换为XSLT属性:

public class XSLTConversion {
    
    public static void main(String[] args) {
        CheckDomain checkDomain = new CheckDomain():
        checkDomain.setDomainName("test");
        checkDomain.setTLD("com");
        checkDomain.setRIMTransactionID("qwertyco123456");
        
        replaceValuesToXSLTFile(checkDomain,"checkdomain.xslt");
    }
    public static void replaceValuesToXSLTFile(CheckDomain checkDomain,String fileName) {
        
    }
}

转换后,我需要如下文件内容

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:apply-templates select="CheckDomainCmd"/>
    </xsl:template>

    <xsl:template match="CheckDomainCmd">
        <epp xmlns="urn:ietf:params:xml:ns:epp-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd">
            <command>
                <check>
                    <domain:check xmlns:domain="http://www.nic.cz/xml/epp/domain-1.4" xsi:schemaLocation="http://www.nic.cz/xml/epp/domain-1.4 domain-1.4.xsd">
                        <domain:name><xsl:value-of select="test"/>.<xsl:value-of select="com" /></domain:name>
                    </domain:check>
                </check>
                <clTRID>
                    <xsl:value-of select="qwertyco123456"/>
                </clTRID>
            </command>
        </epp>
    </xsl:template>
</xsl:stylesheet>

解决方法

您的XSLT代码需要声明全局参数并引用它们:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="DomainName"/>
    <xsl:param name="TLD"/>
    <xsl:param name="RIMTransactionID"/>
    <xsl:template match="/">
        <xsl:apply-templates select="CheckDomainCmd"/>
    </xsl:template>

    <xsl:template match="CheckDomainCmd">
        <epp xmlns="urn:ietf:params:xml:ns:epp-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd">
            <command>
                <check>
                    <domain:check xmlns:domain="http://www.nic.cz/xml/epp/domain-1.4" xsi:schemaLocation="http://www.nic.cz/xml/epp/domain-1.4 domain-1.4.xsd">
                        <domain:name><xsl:value-of select="$DomainName"/>.<xsl:value-of select="$TLD" /></domain:name>
                    </domain:check>
                </check>
                <clTRID>
                    <xsl:value-of select="$RIMTransactionID"/>
                </clTRID>
            </command>
        </epp>
    </xsl:template>
</xsl:stylesheet>

然后,您的Java代码可以从XSLT创建Transformer并使用例如在调用transformer.setParameter("TLD",checkDomain.getTLD())方法之前,请使用transform(请参阅https://docs.oracle.com/javase/8/docs/api/javax/xml/transform/Transformer.html#setParameter-java.lang.String-java.lang.Object-)等其他参数。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...