我想用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我不跟迈克说了,因为迈克是老板。
如果我选择了nb=3,那么我需要以下内容:
sven > mike我想在我的xslt中使用一个一直在回忆到boss="1“的模板。
但我不知道我该怎么做。有人能帮我,给我另一个可能得到我想要的结果吗?
发布于 2014-11-28 08:55:51
试一试如下:
XSLT1.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>发布于 2014-11-28 08:54:37
考虑使用xsl:key通过nb属性查找row元素
<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>https://stackoverflow.com/questions/27184696
复制相似问题