在Select for for-each中使用XSLT concat()函数

时间:2010-01-08 07:10:07

标签: xslt

我正在尝试生成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中使用变量吗?

2 个答案:

答案 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" />