我是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是一个完全错误的方法/观点?
希望我的想法得到明确,提前感谢任何评论。
答案 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