我正在尝试生成HTML,它将通过XSLT显示来自XML的数据。 XML包含动态生成的标题标记,如h1,h2,h3,h4等。
现在在XSLT中我想动态访问单个for-each中的h1,h2和h3,因为标题可以在级别中较小,例如h1,h2或者可以更深层次,如h1,h2,h3和H4。
输出HTML可能如下所示:
h1_value1 h1_value2 h2_valu1 h2value3 .... ..... h3_value1 h3_value2 h3_value3 h3_value4 h3_value5 .... .....
我的XSLT包含一个变量,该变量增加到我们已计算的级别数。这意味着如果有3个级别,则XML中将包含h1,h2和h3标记。因此,为了访问这些标签,我使用了concat()函数来选择for-each和连接的“h”和变量,例如j。模板将以递归方式调用,每次j将增加1到级别数。
但是在select-for-each中使用concat()函数会产生未被捕获的错误。我不能在select for-each中使用concat()函数,或者在使用concat()函数的select-for-each中使用变量吗?
答案 0 :(得分:3)
你不能
<xsl:for-each select="concat('h', $number)">
</xsl:for-each>
但你可以
<xsl:for-each select="*[name() = concat('h', $number)]">
</xsl:for-each>
XPath函数只能用于节点测试(方括号内的表达式部分),但不能用于位置步骤。
首先,您必须在位置步骤中找到节点(此处*
执行此操作,选择所有子节点 - 但您可以使用任何XPath),然后您可以测试它们上的条件,例如检查其名称
答案 1 :(得分:0)
也许 xsl:number 可能会派上用场。
如果你发布了一些样本数据,我可以提供我想到的xsl。
xsl:sort - 你的hXX节点怎么样?
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="xdepth" select="matrix/x-depth" />
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="h">
<xsl:apply-templates>
<xsl:sort select="local-name()" data-type="text" order="ascending" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="matrix/h/*">
<tr>
<xsl:apply-templates />
</tr>
</xsl:template>
<xsl:template match="title">
<td>
<xsl:value-of select="." />
</td>
<th>
<xsl:value-of select="." />
</th>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="x-depth" />
<xsl:template match="y-depth" />
<xsl:template match="number-of-measure" />