XSLT中的设计和编码模式

时间:2015-09-23 06:43:55

标签: xslt

我是XSLT的新手并且有一个普遍的问题。 要区分具有不同属性的两个元素,使用<xsl:template match="foo[@aOne]"><xsl:template match="foo[@aTwo]">会更好(也是为了提高性能) 而不是一个模板中的<xsl:if test="@aOne">。据我所知,这就是人们应该如何思考&#34;在XSLT中。但在我的意见中,这有一个缺点,即它会导致代码的多余部分。

例如:元素与两个属性的匹配

<foo aOne="asdf">
   ...
</foo>

<foo aTwo="asdf">
   ...
</foo>

模板看起来像这样:

<xsl:template match="foo[@aOne]">
    <div>
      <p> 
         <xsl:value-of select="@aOne"/>
      </p>
    </div>
</xsl:template>


<xsl:template match="foo[@aTwo]">
    <div>
      <p>
        <xsl:value-of select="@aTwo"/>
      </p>
    </div>
</xsl:template>

因此,必须多次编写所有(如示例中的<div>等)。

是否存在某种模板设计模式,就像它从Java中知道的那样?

或者编程XSLT是一个完全错误的方法/观点?

希望我的想法得到明确,提前感谢任何评论。

3 个答案:

答案 0 :(得分:2)

这两个属性是否相互排斥?如果是这样,我会写

<xsl:template match="foo[@aOne|@aTwo]">
    <div>
      <p> 
         <xsl:value-of select="@aOne|@aTwo"/>
      </p>
    </div>
</xsl:template>

如果它们不相互排斥,那么你有两个模板规则的方法似乎是不合适的:对于aane缺席或存在的四种可能组合将有四个规则,并且@aTwo不存在或存在。

答案 1 :(得分:1)

我不想绘制任何一般规则。我认为在您的具体示例中,您可以这样做:

<xsl:template match="foo">
    <div>
        <p> 
            <xsl:apply-templates select="@*"/>
        </p>
    </div>
</xsl:template>

<xsl:template match="@aOne | @aTwo">
    <xsl:value-of select="."/>
</xsl:template>

甚至:

<xsl:template match="foo">
    <div>
        <p> 
            <xsl:value-of select="@aOne | @aTwo"/>
        </p>
    </div>
</xsl:template>

或其他一些变体(我们对输入可能包含的内容不够了解。)

答案 2 :(得分:0)

@Abel:你的链接让我得到了我正在寻找的答案。

还发现了一个在线食谱,其中包含许多有用的提示,可用于在XSLT中进行良好的代码设计

http://users.atw.hu/xsltcookbook2/index.html

特别是这部分很有帮助,因为我要求Java中已知的“模板”模式。它描述了如何在XSLT中实现面向对象的重用。

http://users.atw.hu/xsltcookbook2/xsltckbk2-chp-6-sect-6.html