我想用xslt制作一个向下钻取报告 我有这个xml:
<dbqueries>
<dbquery id="pers">
<rows>
<row nb="1" name="walt" mgr="2" boss="0"/>
<row nb="2" name="pete" mgr="4" boss="0"/>
<row nb="2" name="marie" mgr="4" boss="0"/>
<row nb="3" name="sven" mgr="4" boss="0"/>
<row nb="4" name="mike" mgr="5" boss="1"/>
</rows>
</dbquery>
</dbqueries>
如果我选择例如nb = 1,我想要以下结果:
walt > pete > mike
我和迈克一起停下来,因为迈克是老板(= 1)
如果我选择nb = 3,那么我想要以下内容:
sven > mike
我想在我的xslt中做一些模板,这个模板一直在召回,直到boss =&#34; 1&#34;
但我不确定我该怎么做。有人可以帮助我,让我有另一种可能获得我想要的结果吗?
答案 0 :(得分:2)
尝试类似:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8"/>
<xsl:param name="nb" select="1"/>
<xsl:key name="row-by-nb" match="row" use="@nb" />
<xsl:template match="/">
<xsl:apply-templates select="key('row-by-nb', $nb)"/>
</xsl:template>
<xsl:template match="row">
<xsl:value-of select="@name"/>
<xsl:if test="not(@boss=1)">
<xsl:text> > </xsl:text>
<xsl:apply-templates select="key('row-by-nb', @mgr)"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
考虑使用xsl:key
按row
属性
nb
个元素
<xsl:key name="row_by_nb" match="row" use="@nb" />
假设您将nb值作为参数传递,您可以通过使用键选择相关行来开始
<xsl:apply-templates select="key('row_by_nb', $nb)" />
然后,在匹配row
的模板中,您只需输出其名称即可。然后,您可以测试他们是否有经理,如果是,您将使用密钥递归调用模板
<xsl:if test="key('row_by_nb', @mgr)[1]">
<xsl:text> > </xsl:text>
<xsl:apply-templates select="key('row_by_nb', @mgr)[1]" />
</xsl:if>
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output output="text" />
<xsl:param name="nb" select="'1'" />
<xsl:key name="row_by_nb" match="row" use="@nb" />
<xsl:template match="/">
<xsl:apply-templates select="key('row_by_nb', $nb)" />
</xsl:template>
<xsl:template match="row">
<xsl:value-of select="@name" />
<xsl:if test="key('row_by_nb', @mgr)[1]">
<xsl:text> > </xsl:text>
<xsl:apply-templates select="key('row_by_nb', @mgr)[1]" />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
或许这可以避免重复使用密钥
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output output="text" />
<xsl:param name="nb" select="'1'" />
<xsl:key name="row_by_nb" match="row" use="@nb" />
<xsl:template match="/">
<xsl:apply-templates select="key('row_by_nb', $nb)" />
</xsl:template>
<xsl:template match="row">
<xsl:param name="separator" select="''" />
<xsl:value-of select="$separator" />
<xsl:value-of select="@name" />
<xsl:apply-templates select="key('row_by_nb', @mgr)[1]">
<xsl:with-param name="separator" select="' > '" />
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>