Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于XML输入的动态XML响应_Java_Xml_Xslt_Soap - Fatal编程技术网

Java 基于XML输入的动态XML响应

Java 基于XML输入的动态XML响应,java,xml,xslt,soap,Java,Xml,Xslt,Soap,我们正在构建一个web服务,它接受XML输入并基于输入提供XML响应。输入XML包含具有空值的XML结构,空值将根据数据库中的数据替换为实际值。如果用户不需要所有详细信息,则可以减少输入XML中请求的节点数 示例输入XML <?xml version="1.0" encoding="UTF-8"?> <XML> <RequestHeader> <id>123</id> </RequestHeader

我们正在构建一个web服务,它接受XML输入并基于输入提供XML响应。输入XML包含具有空值的XML结构,空值将根据数据库中的数据替换为实际值。如果用户不需要所有详细信息,则可以减少输入XML中请求的节点数

示例输入XML

<?xml version="1.0" encoding="UTF-8"?>
<XML>
    <RequestHeader>
        <id>123</id>
    </RequestHeader>
    <RequestedElement>
        <ABC>
            <DEF>
                <GHI />
                <JKL>
                    <MNO />
                </JKL>
            </DEF>
        </ABC>
    </RequestedElement>
</XML>

123
样本响应

<XML>
    <ABC>
        <DEF>
            <GHI>Value1</GHI>
            <JKL>
                <MNO>Value2</MNO>
            </JKL>
        </DEF>
    </ABC>
</XML>

价值1
价值2
我现在实现的方法是将XML节点映射到表名和列名,然后使用反射从数据库检索数据并生成XML。然而,使用反射会减慢整个过程

我可以想到的另一个选择是,消除反射,创建包含所有节点的XML,然后使用XSLT生成包含所请求节点的最终XML。使用XSLT可以做到这一点吗

有没有更好的方法可以提高性能并达到预期效果

我们正在构建一个web服务,它接受XML输入并提供 以及基于输入的XML响应。输入XML包含XML 结构,则空值将替换为 基于数据库中数据的实际值。用户可以减少 输入XML中请求的节点数(如果不需要) 所有细节

实现这一点的一种方法是调用所选的XSLT处理器(不同的XSLT处理器如何实现这一点——请阅读文档),将全局转换参数传递给它,这些参数的名称是应该接收相应值的元素的名称

在下面的转换中,参数的值是硬编码的,但在实际实现中,这些值必须由调用程序提供——因此在XSLT代码中,它们将如下所示:

 <xsl:param name="GHI"/>
 <xsl:param name="MNO"/>

以下是完整的转换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="GHI">Value1</xsl:param>
 <xsl:param name="MNO">Value2</xsl:param>

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

  <xsl:template match="RequestHeader"/>

  <xsl:template match="*[not(node()) and name() = document('')/*/xsl:param/@name]">
    <xsl:copy>
      <xsl:value-of select="document('')/*/xsl:param[@name = name(current())]"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

价值1
价值2
当此转换应用于提供的XML文档时

<XML>
    <RequestHeader>
        <id>123</id>
    </RequestHeader>
    <RequestedElement>
        <ABC>
            <DEF>
                <GHI />
                <JKL>
                    <MNO />
                </JKL>
            </DEF>
        </ABC>
    </RequestedElement>
</XML>
<XML>
   <RequestedElement>
      <ABC>
         <DEF>
            <GHI>Value1</GHI>
            <JKL>
               <MNO>Value2</MNO>
            </JKL>
         </DEF>
      </ABC>
   </RequestedElement>
</XML>

123
产生所需结果

<XML>
    <RequestHeader>
        <id>123</id>
    </RequestHeader>
    <RequestedElement>
        <ABC>
            <DEF>
                <GHI />
                <JKL>
                    <MNO />
                </JKL>
            </DEF>
        </ABC>
    </RequestedElement>
</XML>
<XML>
   <RequestedElement>
      <ABC>
         <DEF>
            <GHI>Value1</GHI>
            <JKL>
               <MNO>Value2</MNO>
            </JKL>
         </DEF>
      </ABC>
   </RequestedElement>
</XML>

价值1
价值2
我们正在构建一个web服务,它接受XML输入并提供 以及基于输入的XML响应。输入XML包含XML 结构,则空值将替换为 基于数据库中数据的实际值。用户可以减少 输入XML中请求的节点数(如果不需要) 所有细节

实现这一点的一种方法是调用所选的XSLT处理器(不同的XSLT处理器如何实现这一点——请阅读文档),将全局转换参数传递给它,这些参数的名称是应该接收相应值的元素的名称

在下面的转换中,参数的值是硬编码的,但在实际实现中,这些值必须由调用程序提供——因此在XSLT代码中,它们将如下所示:

 <xsl:param name="GHI"/>
 <xsl:param name="MNO"/>

以下是完整的转换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="GHI">Value1</xsl:param>
 <xsl:param name="MNO">Value2</xsl:param>

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

  <xsl:template match="RequestHeader"/>

  <xsl:template match="*[not(node()) and name() = document('')/*/xsl:param/@name]">
    <xsl:copy>
      <xsl:value-of select="document('')/*/xsl:param[@name = name(current())]"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

价值1
价值2
当此转换应用于提供的XML文档时

<XML>
    <RequestHeader>
        <id>123</id>
    </RequestHeader>
    <RequestedElement>
        <ABC>
            <DEF>
                <GHI />
                <JKL>
                    <MNO />
                </JKL>
            </DEF>
        </ABC>
    </RequestedElement>
</XML>
<XML>
   <RequestedElement>
      <ABC>
         <DEF>
            <GHI>Value1</GHI>
            <JKL>
               <MNO>Value2</MNO>
            </JKL>
         </DEF>
      </ABC>
   </RequestedElement>
</XML>

123
产生所需结果

<XML>
    <RequestHeader>
        <id>123</id>
    </RequestHeader>
    <RequestedElement>
        <ABC>
            <DEF>
                <GHI />
                <JKL>
                    <MNO />
                </JKL>
            </DEF>
        </ABC>
    </RequestedElement>
</XML>
<XML>
   <RequestedElement>
      <ABC>
         <DEF>
            <GHI>Value1</GHI>
            <JKL>
               <MNO>Value2</MNO>
            </JKL>
         </DEF>
      </ABC>
   </RequestedElement>
</XML>

价值1
价值2

GraphQL放炮
GraphQL放炮