我需要开发一个应用程序,它会定期检查来自XML提要的数据,处理它并采取适当的操作,如通知用户等,但主要用于生成和查看报告。这个xml feed基本上会检查应用程序的正常运行时间和停机时间。
以下是我要遵循的步骤:
现在,此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文件。
答案 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>