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