【问题标题】:Logic for passing variable number of parameters to XSLT将可变数量的参数传递给 XSLT 的逻辑
【发布时间】:2012-01-22 01:16:34
【问题描述】:

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

以下是我正在遵循的步骤:

  1. 我正在将一个 xml 文件从远程位置下载到我自己的服务器。
  2. 从属性文件中检查要监视的应用程序。
  3. 使用 XSLT 将其转换为 html 并邮寄 html 页面。

现在,此 XML 提要还包含不需要监视的应用程序,并使用 java.util.properties 中的属性文件进行检查。可以稍后添加被监控的应用程序。

那么有没有办法将它也包含在 xsl 文件中? (我也可以将参数从 java 传递到 xslt,但参数的数量是可变的。我将应用程序名称分组并使用两个参数传递它,但由于无法使用 xsl:for-each 的迭代器来比较这些值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>

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

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

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

【问题讨论】:

    标签: java xslt xml-parsing


    【解决方案1】:

    好的,所以我能够做到这一点。 我没有传递参数,而是创建了一个 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>
    

    【讨论】:

      【解决方案2】:

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

      传递这样的东西:

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

      【讨论】:

      • 或者在 XSLT 2.0 中,假设您的处理器 API 允许,您可以传递字符串序列(或数字序列等) - 在 Saxon 中,任何 Java Iterable 都应该可以。
      • 几年前尝试过。但无济于事......但是一个解决方法,可能是你传递了一个参数 - 字符串。这个字符串将使用 document() 函数,我反过来得到你的 XML 参数?我知道这是一个两阶段逻辑并且需要文件系统 - 但现在它可以工作......
      • @Mike:您可能只尝试过从命令行传递参数。我正在使用的每个 XSLT 处理器都有自己的 API,它允许将更复杂的结构作为参数传递——包括整个解析的 XML 文档或它们的单个元素。只需阅读 XSLT 处理器的文档即可。
      • @DimitreNovaatchev:尝试了传递 xml 树的路径,但在将 xml 树节点与实际 xml 文件进行比较时卡住了。 (我正在使用 for-each 来迭代和测试 xml 文件中的条件)。基本上,如果有办法同时迭代 xml 参数树和 xml 文件,这是最好的选择。
      • @user1102065:您的问题是关于将未定义数量的参数传递给转换的方法,您得到了很好的答案。现在你要介绍一个新问题——请把它作为一个新问题而不是作为评论提出。由于您已成功传递并访问了多个参数,请保持道德并接受您认为最好/最有用的答案。未来,当您累积 50 分时,您将有权投票给任何其他答案。
      【解决方案3】:

      为什么不使用 JAXB 为您提供 XML 数据的 Java 表示。然后,您可以使用属性文件(或将来可能替换属性文件的任何内容,如数据库表)来处理 Java 代码中的数据,然后只需使用 JSP/Velocity/&lt;insert favourite view tech here&gt; 创建 HTML 输出

      这可能是一个比试图将所有东西都塞进 XSL 更灵活的设计

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-03
        • 2013-09-21
        • 1970-01-01
        • 2015-09-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多