提问人:payne 提问时间:2/13/2019 最后编辑:payne 更新时间:2/14/2019 访问量:37
对同一模板使用不同的“选择”(避免重复)
Using different 'select' for same template (avoiding repetition)
问:
下面是简化的问题:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml"
version="2.0">
<xsl:param name="foo" select="'test'"/> <!-- 'test' can also be empty '' or whatever -->
<!-- XHTML validation -->
<xsl:output method="xml"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
indent="yes"
encoding="UTF-8"/>
<xsl:template match="/">
<html>
<head>
<title>bar</title>
</head>
<body>
<xsl:choose>
<xsl:when test="string-length($foo)=0">
<ol>
<xsl:for-each select="something/something2"> <!-- SEE THIS? -->
<li>
<xsl:call-template name="generic" />
</li>
</xsl:for-each>
</ol>
</xsl:when>
<xsl:otherwise>
<ol>
<xsl:for-each select="something/something2[tmp = $foo"]> <!-- SO MUCH REPETITION!! -->
<li>
<xsl:call-template name="generic" />
</li>
</xsl:for-each>
</ol>
</xsl:otherwise>
</xsl:choose>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
我认为这很简单:我怎样才能避免这种重复?我尝试使用设置一个,但后来我不能在 之外使用变量,所以它变得毫无用处。xsl:if
xsl:variable
if
同样,我只想在 时应用唯一的 ,否则,它应该只被自己调用(和变得无关紧要,不应该显示)。再说一遍:一个微不足道的解决方案涉及很多重复,但我宁愿避免这样的事情。<ol>
<xsl:if test="count($varYouMightFigureOut) > 1">
<xsl:call-template name="generic" />
for-each
<li>
有什么想法吗?
谢谢!
答:
0赞
zx485
2/13/2019
#1
您可以通过完全拥抱 XSLT 的内在美来避免这种重复。
利用模板功能,如以下示例所示:
将中央模板简化为基本内容:
<xsl:template match="/">
<html>
<head>
<title>bar</title>
</head>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
并添加两个子模板,在假设的根元素上实现最后一个条件(其名称必须与 XML 根元素的名称相同)IF
<root>
<xsl:template match="root">
<xsl:call-template name="generic" />
</xsl:template>
<xsl:template match="root[$varYouMightFigureOut > 1]">
<ol>
<xsl:apply-templates />
</ol>
</xsl:template>
然后将两种可能性压缩为这两个模板:xsl:choose
<xsl:template match="something/something2[string-length($foo)=0]">
<li>
<xsl:call-template name="generic" />
</li>
</xsl:template>
<xsl:template match="something/something2[tmp = $foo]">
<li>
<xsl:call-template name="generic" />
</li>
</xsl:template>
(如有必要,您可以向 添加参数)。xsl:call-template
并使用上述模板使用的占位符“通用”模板完成此操作:
<xsl:template name="generic">
<xsl:value-of select="normalize-space(.)" />
</xsl:template>
该解决方案避免了所有不必要的重复,并利用了 XSLT 的强大功能。
评论