如何在xslt中从xml中获取不同的元素

时间:2018-01-18 08:42:54

标签: xslt xslt-1.0

我使用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>

预期产出:

  1. 水平
    。约翰
    。彼得
  2. 垂直
    。贾斯汀
  3. 如何在XSLT模板代码中实现此目的?换句话说,如何与相关员工展示不同的单位?

1 个答案:

答案 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, '>', ''), '&#xA;')"/>            
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="concat(position(), '. ', $param.unit, '&#xA;')"/>
        </xsl:otherwise>
    </xsl:choose>    
    <xsl:for-each select="/employees/employee[unit = $param.unit]">
        <xsl:value-of select="concat('   . ', name, '&#xA;')"/>
    </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(向所有人展示您尝试过的内容)以避免“向下投票”。希望它对您的情况有所帮助。