围绕复制粘贴代码块的有效解决方案

时间:2014-08-18 08:32:10

标签: xslt

来自像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

1 个答案:

答案 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。祝你好运!