【问题标题】:Passing a variable number of parameters to Microsoft XSLT processor将可变数量的参数传递给 Microsoft XSLT 处理器
【发布时间】:2015-03-03 21:41:29
【问题描述】:

在数据库中,用户根据自己的需要创建了许多属性。在服务器端生成的 XML 包括数据库中的所有属性以及它们保存的数据。由 Microsoft 的 XSLT 处理器生成的报告包括这些属性的子集,这些属性基于用户的选择(通过 UI 中的复选框列表)。

<xml ...>
    <property id="01" title="First Property" value="Beauty of XSLT"/>
    <property id="02" title="Second Property" value="Please Help"/>
    <property id="XX" title="Variable Number" value="Use Global Variables"/>
</xml>

以前,我有固定数量的具有预定义名称的属性。我在 XSL 文件中使用了全局变量并将它们的值(打开或关闭)传递给 XSLT 处理器。现在,属性的名称和编号都是用户定义的。

不知何故,我需要将要显示的属性列表传递给 XSLT 处理器。我不确定如何。任何建议或指导表示赞赏。

编辑——添加说明:

在服务器端生成的 XML 包括所有属性,无论用户选择如何。根据用户选择要显示的属性,转换在客户端完成。用户可以更改此选择,但我们不会重新生成 XML。我们只是将不同的值作为全局变量传递给 XSLT 处理器。固定这些属性后,全局变量如下所示:g_property_id-01 设置为true,显示或false,不显示。现在,我不知道用户创建的属性的数量/名称;因此我的问题。

编辑——按要求添加 XSLT:

<?xml version="1.0"?>

<xsl:stylesheet ...>
...
<!-- This XSL Template is used to transform report results into HTML. -->

  <xsl:param name="g_bShow_Property01" select="1"/>
  <xsl:param name="g_bShowUser" select="1"/>
    ...

  <xsl:template match="Result">
    <xsl:variable name="g_bShowHeader" select="$g_bShowUser=1 or $g_bShow_Property01=1"/>
    ...
    <!-- Should we show the Property with 01 id? -->
      <xsl:if test="$g_bShow_Property01 = 1 and ./Document/Property02Value">
        <xsl:variable name="FixedUpProperty">
          <xsl:call-template name="fixup-text">
            <xsl:with-param name="fixup-string" select="./Document/Property02Value"/>
          </xsl:call-template>
        </xsl:variable>
    </xsl:if>

</xsl:stylesheet>

【问题讨论】:

    标签: xslt msxml msxml3


    【解决方案1】:

    您可能希望重构您的 XSLT 以使用 for-each 循环,如下所示:

    <xsl:for-each select="/xml/property">
      ... process the property ...
    </xsl:for-each>
    

    【讨论】:

      【解决方案2】:

      假设 MSXML:

      我看到了两种可能的方法,将 XML 文档作为具有所有名称的参数传递,只要您使用其 API 和某种编程语言(而不是从命令行)运行处理器,这应该是可能的。因此,使用 MSXML 和 JScript 你会这样做:

      var propDoc = new ActiveXObject('Msxml2.DOMDocument.3.0');
      propDoc.async = false;
      if (propDoc.load('propfile.xml')) {
        // now pass the doc as a parameter to your stylesheet 
        ...
        xsltProc.addParameter('propDoc', propDoc);
      }
      else {
        // handle parse error here
      }
      

      addParameter 方法记录在 https://msdn.microsoft.com/en-us/library/ms762312%28v=vs.85%29.aspx

      在您的样式表中,您将使用例如

      <xsl:param name="propDoc" select="/.."/>
      

      然后你就可以处理$propDoc//property了。

      另一种方法是编写两个样式表,一个首先处理您的属性列表,然后根据需要创建带有所有参数的第二个样式表。然后运行创建的样式表是第二个单独的步骤。我不会详细说明这种方法,只是说 XSLT 可以创建 XSLT 代码,如http://www.w3.org/TR/xslt#literal-result-element 所示。

      【讨论】:

      • 谢谢@martin-honnen。首先,基于List of MS XML parser versions,我相信我使用的是3.0 版本,它是通过COM API 实现的。其次,我是 XML 处理的新手,所以如果您提供有关您建议的两种方法的更多详细信息,我不会感到被冒犯。
      • 在服务器端生成的 XML 包括所有属性,无论用户选择如何。根据用户选择要显示的属性,转换在客户端完成。用户可以更改此选择,但我们不会重新生成 XML。我们只是将不同的值作为全局变量传递给 XSLT 处理器。固定这些属性后,全局变量如下所示:g_property_id-01 并设置为 true,显示或 false 不显示。现在,我不知道用户创建的属性的数量/名称;因此我的问题。谢谢@martin
      • 您能否编辑您的帖子并向我们展示需要使用像&lt;property id="01" title="First Property" value="Beauty of XSLT"/&gt; 这样的属性的XSLT?
      猜你喜欢
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多