没有上下文节点更改的循环
loop without context node change
需要帮助。请在 'department' 模板中查看我的评论。在这里我想多次重复相同的处理(基于 $time 变量)。如果我使用调用模板并传递当前节点,那么我不能重新使用已经编写的子模板规则。实现这一目标的好方法是什么。
XML
<?xml version="1.0" encoding="UTF-8"?>
<emp>
<department name="science">
<empname>Rob</empname>
<empno>01</empno>
<emptype>regular</emptype>
</department>
</emp>
XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:param name="times" select="'a1,b1,c1'"></xsl:param>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="department">
<xsl:copy>
<xsl:copy-of select="@*"></xsl:copy-of>
<xsl:apply-templates select="empname"/>
<someelements></someelements>
<xsl:apply-templates select="empno"/>
<instances>
<xsl:for-each select="tokenize($times, ',\s*')">
<xsl:variable name="time" select="."/>
<iemployee time="{$time}">
<!-- I want to repat the the "department" template here -->
</iemployee>
</xsl:for-each>
</instances>
</xsl:copy>
</xsl:template>
<xsl:template match="empname">
<employeename>
<xsl:apply-templates/>
</employeename>
</xsl:template>
<xsl:template match="empno">
<employeenumber>
<xsl:apply-templates/>
</employeenumber>
</xsl:template>
</xsl:stylesheet>
输出
<department name="science">
<employeename>Rob</employeename>
<someelements/>
<employeenumber>01</employeenumber>
<instances>
<iemployee time="a1">
<employeename>Rob</employeename>
<someelements/>
<employeenumber>01</employeenumber>
</iemployee>
<iemployee time="b1">
<employeename>Rob</employeename>
<someelements/>
<employeenumber>01</employeenumber>
</iemployee>
<iemployee time="c1">
<employeename>Rob</employeename>
<someelements/>
<employeenumber>01</employeenumber>
</iemployee>
</instances>
如果我对你的问题的理解正确,那么我认为你就快到了:
<xsl:template match="department">
<!-- Retain a reference to the current department element -->
<xsl:variable name="dept" select="." as="node()"/>
<xsl:copy>
<xsl:copy-of select="@*"></xsl:copy-of>
<xsl:apply-templates select="empname"/>
<someelements></someelements>
<xsl:apply-templates select="empno"/>
<instances>
<xsl:for-each select="tokenize($times, ',\s*')">
<xsl:variable name="time" select="."/>
<iemployee time="{$time}">
<!-- Apply templates to all children of the department node -->
<xsl:apply-templates select="$dept/*"/>
</iemployee>
</xsl:for-each>
</instances>
</xsl:copy>
</xsl:template>
我认为您需要另一个模式不同的模板:
<xsl:template match="department">
<xsl:copy>
<xsl:copy-of select="@*"></xsl:copy-of>
<xsl:apply-templates select="." mode="content"/>
<instances>
<xsl:variable name="dep" select="."/>
<xsl:for-each select="tokenize($times, ',\s*')">
<xsl:variable name="time" select="."/>
<iemployee time="{$time}">
<xsl:apply-templates select="$dep" mode="content"/>
</iemployee>
</xsl:for-each>
</instances>
</xsl:copy>
</xsl:template>
<xsl:template match="department" mode="content">
<xsl:apply-templates select="empname"/>
<someelements></someelements>
<xsl:apply-templates select="empno"/>
</xsl:template>
需要帮助。请在 'department' 模板中查看我的评论。在这里我想多次重复相同的处理(基于 $time 变量)。如果我使用调用模板并传递当前节点,那么我不能重新使用已经编写的子模板规则。实现这一目标的好方法是什么。
XML
<?xml version="1.0" encoding="UTF-8"?>
<emp>
<department name="science">
<empname>Rob</empname>
<empno>01</empno>
<emptype>regular</emptype>
</department>
</emp>
XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:param name="times" select="'a1,b1,c1'"></xsl:param>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="department">
<xsl:copy>
<xsl:copy-of select="@*"></xsl:copy-of>
<xsl:apply-templates select="empname"/>
<someelements></someelements>
<xsl:apply-templates select="empno"/>
<instances>
<xsl:for-each select="tokenize($times, ',\s*')">
<xsl:variable name="time" select="."/>
<iemployee time="{$time}">
<!-- I want to repat the the "department" template here -->
</iemployee>
</xsl:for-each>
</instances>
</xsl:copy>
</xsl:template>
<xsl:template match="empname">
<employeename>
<xsl:apply-templates/>
</employeename>
</xsl:template>
<xsl:template match="empno">
<employeenumber>
<xsl:apply-templates/>
</employeenumber>
</xsl:template>
</xsl:stylesheet>
输出
<department name="science">
<employeename>Rob</employeename>
<someelements/>
<employeenumber>01</employeenumber>
<instances>
<iemployee time="a1">
<employeename>Rob</employeename>
<someelements/>
<employeenumber>01</employeenumber>
</iemployee>
<iemployee time="b1">
<employeename>Rob</employeename>
<someelements/>
<employeenumber>01</employeenumber>
</iemployee>
<iemployee time="c1">
<employeename>Rob</employeename>
<someelements/>
<employeenumber>01</employeenumber>
</iemployee>
</instances>
如果我对你的问题的理解正确,那么我认为你就快到了:
<xsl:template match="department">
<!-- Retain a reference to the current department element -->
<xsl:variable name="dept" select="." as="node()"/>
<xsl:copy>
<xsl:copy-of select="@*"></xsl:copy-of>
<xsl:apply-templates select="empname"/>
<someelements></someelements>
<xsl:apply-templates select="empno"/>
<instances>
<xsl:for-each select="tokenize($times, ',\s*')">
<xsl:variable name="time" select="."/>
<iemployee time="{$time}">
<!-- Apply templates to all children of the department node -->
<xsl:apply-templates select="$dept/*"/>
</iemployee>
</xsl:for-each>
</instances>
</xsl:copy>
</xsl:template>
我认为您需要另一个模式不同的模板:
<xsl:template match="department">
<xsl:copy>
<xsl:copy-of select="@*"></xsl:copy-of>
<xsl:apply-templates select="." mode="content"/>
<instances>
<xsl:variable name="dep" select="."/>
<xsl:for-each select="tokenize($times, ',\s*')">
<xsl:variable name="time" select="."/>
<iemployee time="{$time}">
<xsl:apply-templates select="$dep" mode="content"/>
</iemployee>
</xsl:for-each>
</instances>
</xsl:copy>
</xsl:template>
<xsl:template match="department" mode="content">
<xsl:apply-templates select="empname"/>
<someelements></someelements>
<xsl:apply-templates select="empno"/>
</xsl:template>