来自像PHP这样的语言,我自然不喜欢一遍又一遍地复制和粘贴代码,只改变一个变量或值。我在XSLT中有一系列代码块,它们一遍又一遍地复制和粘贴,寻找特定的节点值,然后做一些事情。
我从这个块开始,用于填充每个函数的名称列表:
<xsl:variable name="<!-- VARIABLE OF NAMES -->">
<xsl:for-each select="//<!-- FUNCTIONS -->">
<xsl:for-each select="./<!-- USER FUNCTIONS -->">
<xsl:if test="<!-- SPECIFIC FUNCTION -->">
<xsl:value-of select="Title"/>
<xsl:text> </xsl:text>
<xsl:value-of select="FirstName"/>
<xsl:text> </xsl:text>
<xsl:value-of select="LastName"/>
</xsl:for-each>
</xsl:for-each>
</xsl:variable>
这是我用来抓住的逻辑:
<xsl:if test="<!-- SPECIFIC LIST OF USERS THAT HAVE A FUNCTION HAPPEN TO THEM -->">
<xsl:call-template name="<!-- SPECIFIC TEMPLATE FOR IT -->">
<xsl:with-param name="listOfNames">
<xsl:value-of select="<!-- FUNCTION THAT GRABS A LIST OF NAMES -->" disable-output-escaping="yes"/>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
稍后我使用以下代码块来显示结果:
<xsl:template name="<!-- SPECIFIC TEMPLATE -->">
<xsl:param name="listOfNames"/>
<!-- DO SPECIFIC STUFF -->
</xsl:template>
我已经把我的大脑看得很糟糕,而且我无法让我的头脑更加周到地做到这一点。或者至少阻止我为每个函数复制和粘贴相同的三个代码块(其中有18个代码)......
我知道这不是&#34;发布您的代码并将其排序&#34;董事会,但我认真有一个更好的方法来做到这一点,但上帝帮助我,我无法看到它。
以下是XSLT的这一部分使用的XML示例:
<UserUpdated>
<UserDetails>
<Title>MR</Title>
<FirstName>TEST</FirstName>
<LastName>EVO</LastName>
</UserDetails>
</UserUpdated>
<FlightServicingFunction>FUNCTIONNAME</FlightServicingFunction>
<FlightServicingFunction>FUNCTIONNAME</FlightServicingFunction>
<FlightServicingFunction>.... (Continues per function that has to be done to user)
如果您需要更多信息,请与我们联系。提前感谢任何和所有的帮助。
以下是一个示例:http://xsltransform.net/pPqsHSZ
答案 0 :(得分:1)
此XSLT通常由学习语法而非概念的人员制作。这是典型的拉式风格,由知道输入内容的人产生,思维模式自动从中拉数据。
使用XSLT的正确方法是尽可能不注意输入,并且只为您关心的特定标记指定模板。这是推送样式转换。您当前的XSLT依靠xsl:for-each
循环输入标记,然后使用xsl:if
查看标记是否符合您的要求。
相反,您应该将xsl:apply-templates
与通用select
(使用大量通配符)结合使用多个xsl:template
,每个都具有特定匹配。
由于您没有指定任何确切的输入或输出,因此这是一个可以帮助您入门的概念:
<xsl:template match="/">
<xsl:apply-templates select="//FlightServicingFunction" />
</xsl:template>
<xsl:template match="FlightServicingFunction[. = '<!--specific function-->']">
<xsl:value-of select="Title"/>
<xsl:text> </xsl:text>
<xsl:value-of select="FirstName"/>
<xsl:text> </xsl:text>
<xsl:value-of select="LastName"/>
</xsl:template>
您仍然需要复制粘贴xsl:template match="..."
位几次,但是为了让XSLT处理器为您完成,您可以通过这种方式摆脱积极的循环。这就是它的设计目标。
获取其余数据(当前放在变量中的东西)的技巧是克服它们在您匹配的节点集中的相对位置,并使用一个好的XPath来选择它。无论活动节点是什么,它都提供了充足的工具来获取您想要的任何内容。
进一步建议阅读:http://www.usingxml.com/Transforms/XslIdentity。祝你好运!