在数据库中,用户根据需要创建了许多属性。在服务器端生成的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>
答案 0 :(得分:0)
您可能希望重构您的XSLT以使用for-each循环,如下所示:
<xsl:for-each select="/xml/property">
... process the property ...
</xsl:for-each>
答案 1 :(得分:0)
假设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所示。