Использование функции XSLT concat () в Select для каждого - PullRequest
0 голосов
/ 08 января 2010

Я пытаюсь сгенерировать HTML, который будет отображать данные из XML через XSLT. XML содержит теги заголовков, которые генерируются динамически, такие как h1, h2, h3, h4 и т. Д.

Теперь в XSLT я хочу динамически обращаться к 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 () в select for-each и сцепил «h» с переменной, скажем, j. Шаблон будет вызываться рекурсивно, и каждый раз j будет увеличиваться на 1 до количества уровней.

Но использование функции concat () в select for-each дает необработанную ошибку. Разве я не могу использовать функцию concat () для select for-each или использовать переменную для select for-each, которая использует функцию concat ()?

Ответы [ 2 ]

3 голосов
/ 08 января 2010

Вы не можете

<xsl:for-each select="concat('h', $number)">
</xsl:for-each>

но вы можете

<xsl:for-each select="*[name() = concat('h', $number)]">
</xsl:for-each>

Функции XPath могут использоваться только в тестах узлов (части выражения в квадратных скобках), но не в шагах определения местоположения.

Сначала вы должны найти узлы на шаге определения местоположения (здесь это делает *, выбирая все дочерние узлы - но вы можете использовать любой XPath), затем вы можете проверить условие на них, например, проверить их имя.

0 голосов
/ 08 января 2010

Может быть xsl: число может пригодиться здесь.

Если вы опубликуете некоторые образцы данных, я мог бы предоставить xsl, о котором я думаю.

А как насчет xsl: sort -ing ваших узлов 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" />

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...