我使用XSLT 1.0生成PDF。我传递给XSLT文件的数据或XML为:
<employees>
<employee>
<unit>Horizontal></unit>
<name>John</name>
<age>23</age>
</employee>
<employee>
<unit>Vertical</unit>
<name>Justin</name>
<age>28</age>
</employee>
<employee>
<unit>Horizontal></unit>
<name>Peter</name>
<age>36</age>
</employee>
</employees>
预期产出:
如何在XSLT模板代码中实现此目的?换句话说,如何与相关员工展示不同的单位?
答案 0 :(得分:1)
对于与您类似的大多数情况,主要观点是您将分组的价值。在您的情况下,您按非重复项movie = try MovieInput(url: movieURL, playAtActualSpeed: true, loop: true)
进行分组并获取unit
值。因此,我建议创建单独的模板(例如name
),其结构将传递您要分组的参数(例如name-group
),然后简单地在param.unit
的循环中调用模板并重复防止,如下面的XSL:
employee
结果将符合预期:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="text" encoding="utf-8"/>
<xsl:template name="name-group">
<xsl:param name="param.unit"/>
<xsl:choose>
<xsl:when test="contains($param.unit, '>')">
<xsl:value-of select="concat(position(), '. ', translate($param.unit, '>', ''), '
')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(position(), '. ', $param.unit, '
')"/>
</xsl:otherwise>
</xsl:choose>
<xsl:for-each select="/employees/employee[unit = $param.unit]">
<xsl:value-of select="concat(' . ', name, '
')"/>
</xsl:for-each>
</xsl:template>
<xsl:template match="/">
<xsl:for-each select="//employee">
<xsl:if test="not(preceding::employee[unit/text() = current()/unit/text()])">
<xsl:call-template name="name-group">
<xsl:with-param name="param.unit" select="unit"/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
注意! 在接下来的问题中,请放置您的XSL(向所有人展示您尝试过的内容)以避免“向下投票”。希望它对您的情况有所帮助。