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

时间:2011-12-16 14:14:00

标签: java xslt xml-parsing

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

以下是我要遵循的步骤:

  1. 我正在将xml文件从远程位置下载到我自己的服务器。
  2. 从属性文件中检查要监视的应用程序。
  3. 使用XSLT将其转换为html并邮寄html页面。
  4. 现在,此XML提要还包含无需监视的应用程序,并使用java中的属性文件进行检查。可以稍后添加受监视的应用程序。

    那么有什么方法可以将它包含在xsl文件中吗? (我也可以将参数从java传递给xslt,但是参数的数量也是可变的。我正在对应用程序名称进行分组并使用两个参数传递它,但因为使用xsl:for-each迭代器无法比较这些值而卡住了XML Feed文件。)

    编辑:

    <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 Feed。我正在迭代这个xml ..i需要检查应用程序节点中的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>
    

    目前名称属性是硬编码的。我需要使用从java代码传递的参数列表中的这些 - 参数字符串 app1,app2 和节点中的参数设置为

    <root>
    <application @name="ABC"></application>
    <application @name="XYZ"></application>
    </root>
    

    问题是我如何迭代参数,因为我还需要迭代xml文件。

3 个答案:

答案 0 :(得分:1)

为什么不使用JAXB为您提供XML数据的Java表示。然后,您可以使用属性文件(或将来可能替换属性文件的任何内容,如数据库表)使用Java代码中的数据进行播放,然后使用JSP / Velocity / {{1创建HTML输出}}

这可能是一种更灵活的设计,而不是试图将所有东西都塞进XSL

答案 1 :(得分:1)

将“多个参数”传递给转换的方法是传递单个参数,即XML元素(树),其子元素将被处理并通过转换视为实际(逻辑)参数。 / p>

传递类似这样的内容:

<params>
 <param name="p1"> some subtree/<param>

.  .  .  .  

 <param name="pk"> some subtree/<param>
<params>

答案 2 :(得分:0)

好的,所以我能够做到这一点。 我创建了一个XML文件,并使用文档函数在模板中读取该文件,而不是传递参数。 该模板是从for-each主文档中调用的。 在这里,我将参数传递给模板,遍历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>