Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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 将可变数量的参数传递给XSLT的逻辑_Java_Xslt_Xml Parsing - Fatal编程技术网

Java 将可变数量的参数传递给XSLT的逻辑

Java 将可变数量的参数传递给XSLT的逻辑,java,xslt,xml-parsing,Java,Xslt,Xml Parsing,我需要开发一个应用程序,定期检查来自XML提要的数据,对其进行处理,并采取适当的措施,如通知用户等,但主要用于生成和查看报告。这个xml提要基本上检查应用程序的正常运行时间和停机时间 以下是我将遵循的步骤: 我正在将一个xml文件从远程位置下载到我自己的服务器 从属性文件检查要监视的应用程序 使用XSLT将其转换为html并发送html页面 现在,这个XML提要还包含不需要监视的应用程序,并使用java中的属性文件进行检查。稍后可以添加受监视的应用程序 那么,有没有办法将其也包含在xsl文件中?

我需要开发一个应用程序,定期检查来自XML提要的数据,对其进行处理,并采取适当的措施,如通知用户等,但主要用于生成和查看报告。这个xml提要基本上检查应用程序的正常运行时间和停机时间

以下是我将遵循的步骤:

  • 我正在将一个xml文件从远程位置下载到我自己的服务器
  • 从属性文件检查要监视的应用程序
  • 使用XSLT将其转换为html并发送html页面
  • 现在,这个XML提要还包含不需要监视的应用程序,并使用java中的属性文件进行检查。稍后可以添加受监视的应用程序

    那么,有没有办法将其也包含在xsl文件中?(我也可以将参数从java传递到xslt,但参数的数量是可变的。我正在对应用程序名称进行分组,并使用两个参数传递它,但由于无法使用XML提要文件的每个迭代器对这些值进行比较而被卡住。)

    编辑:

    <begin last-update="12/16/2011 06:18:31 am">
        <application id="1" name="xyz" last-update="12/16/2011 6:16:03 AM">
            <node2 code="normal">
                <childnodes></childnodes>
                <childnodes></childnodes>
            </node2>
    
        </application>
        <application id="2" name="abc" last-update="12/14/2011 6:16:03 AM">
            ... Same as before
    </application>
    </begin>
    
    
    ... 和以前一样
    
    这是xml提要。我正在遍历此xml..我需要检查应用程序节点中的name属性。。下面是xsl代码

    <xsl:for-each select="begin/application">
    <!-- Need this to be fetched dynamically using xsl params -->
    <xsl:if test="@name='abc' or @name=xyz' >
    <tr width="100%" style="border:solid 1px black;">
    <td  style="text-align:center; vertical-align:center;">DATA</td>
    <td  style="text-align:center; vertical-align:center;">DATA</td>
    <td  style="text-align:center; vertical-align:center;">DATA</td>
    </tr>
    </xsl:if>
    
    
    
    为什么不使用JAXB为您的XML数据提供Java表示呢。然后,您可以使用属性文件(或者将来可能用其他任何文件替代属性文件的文件,如数据库表)在Java代码中处理数据,然后使用JSP/Velocity/


    这可能是一种更灵活的设计,而不是将所有内容都塞进XSL中。为什么不使用JAXB为XML数据提供Java表示呢。然后,您可以使用属性文件(或者将来可能用其他任何文件替代属性文件的文件,如数据库表)在Java代码中处理数据,然后使用JSP/Velocity/

    这可能是一种更灵活的设计,而不是将所有内容都塞进XSL中。向转换传递“多个参数”的方法是传递单个参数,即XML元素(树),其子元素将被转换处理并作为实际(逻辑)参数处理

    传递这样的信息:

    <params>
     <param name="p1"> some subtree/<param>
    
    .  .  .  .  
    
     <param name="pk"> some subtree/<param>
    <params>
    
    
    某子树/
    .  .  .  .  
    某子树/
    
    向转换传递“多个参数”的方法是传递单个参数,即XML元素(树),其子元素将被转换处理并视为实际(逻辑)参数

    传递这样的信息:

    <params>
     <param name="p1"> some subtree/<param>
    
    .  .  .  .  
    
     <param name="pk"> some subtree/<param>
    <params>
    
    
    某子树/
    .  .  .  .  
    某子树/
    
    好的,所以我能够做到这一点。 我没有传递参数,而是创建了一个XML文件,并使用document函数在模板中读取该文件。 此模板是从内部为每个主文档调用的。 在这里,我将参数传递给模板,遍历XML文件并执行我应该执行的任何操作

    嗯,以防有人陷入像我这样的愚蠢境地,他们在投入大量时间之前没有考虑清楚。 JAXB是最好的解决方法。 我确实实现了JAXB解决方案,它非常简单。 但是,由于xslt目前满足了我的需求,我将使用xslt

    XSLT代码:

    <xsl:for-each select="begin/application">
    <xsl:call-template name="doSome">
        <xsl:with-param name="appname" select="@name" />
    </xsl:call-template>
    <xsl:template name="doSome">
        <xsl:param name="appname" />
        <xsl:for-each select="document('file:///E:/LOG/list.xml')/root/application">
            <xsl:if test="@name=$appname">                  
                ... do whatever you want to do
            </xsl:if>
         </xsl:for-each>
    </xsl:template>
    
    
    ... 做你想做的事
    
    好的,所以我能够做到这一点。 我没有传递参数,而是创建了一个XML文件,并使用document函数在模板中读取该文件。 此模板是从内部为每个主文档调用的。 在这里,我将参数传递给模板,遍历XML文件并执行我应该执行的任何操作

    嗯,以防有人陷入像我这样的愚蠢境地,他们在投入大量时间之前没有考虑清楚。 JAXB是最好的解决方法。 我确实实现了JAXB解决方案,它非常简单。 但是,由于xslt目前满足了我的需求,我将使用xslt

    XSLT代码:

    <xsl:for-each select="begin/application">
    <xsl:call-template name="doSome">
        <xsl:with-param name="appname" select="@name" />
    </xsl:call-template>
    <xsl:template name="doSome">
        <xsl:param name="appname" />
        <xsl:for-each select="document('file:///E:/LOG/list.xml')/root/application">
            <xsl:if test="@name=$appname">                  
                ... do whatever you want to do
            </xsl:if>
         </xsl:for-each>
    </xsl:template>
    
    
    ... 做你想做的事
    
    或者在XSLT 2.0中,如果处理器API允许,您可以传递字符串序列(或数字序列等)——在Saxon中,任何Java Iterable都应该可以。几年前就尝试过了。但是没有用。。。但是,一个错误可能是您传递了一个参数字符串。这个字符串将使用document()函数,我将其转换为获取您的XML参数?我知道这是一个两阶段的逻辑,需要文件系统——但现在它可以工作了…@Mike:您可能只尝试过从命令行传递参数。我正在使用的不止一个dosen的每个XSLT处理器都有自己的API,允许将更复杂的结构作为参数传递——包括整个解析的XML文档或它们各自的元素。请阅读XSLT处理器的文档。@DimitreNovatchev:尝试了传递xml树的路径,但在将xml树节点与实际xml文件进行比较时遇到了问题。(我使用for-each来迭代和测试xml文件中的条件)。基本上,如果有一种方法可以迭代xml参数树和xml文件,这是最好的选择。@user1102065:您的问题是关于如何将未定义数量的参数传递给转换,您得到了很好的答案。现在你提出了一个新问题——请把它作为一个新问题而不是评论来提问。当您成功地访问并访问了多个参数时,请遵守道德规范,接受您认为是最好的/最有用的ANS。