Может ли xsl xpath expression читать свой собственный шаблон?

Я в настоящее время жестко программирую colspan значение, но можно ли рассчитать его по количеству ячеек таблицы в строке, например, используя xsl:variable?

Сложность заключается в том, что узлы XML содержат больше атрибутов, чем то, что я пытаюсь показать с помощью XSL, поэтому я НЕ МОГУ ссылаться на сам XML для подсчета. Вот почему мне интересно, могу ли я вместо этого ссылаться на шаблон HTML внутри XSL.

Пример XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xsl/allcompanies.xsl"?>
<Companies>
    <row Name="Company One" Address="Grote Markt 1" ZIP="1000" City="BRUSSEL" Country="BE" Telephone="02 261 05 55" Fax="" Email="" />
    <row Name="Company Two" Address="Tielweg 10" ZIP="2803 PK" City="Gouda" Country="NL" Telephone="" Fax="" Email=""/>
    <row Name="Company Three" Address="6 S.Millrock Drive" ZIP="UT 84121" City="Salt Lake City" Country="US" Telephone="+1 801 928 0000" Fax="" Email="" />
</Companies>

XSL:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
    <html>
    <body>
    <table>
        <tr>
            <th colspan="6">Companies</th>
        </tr>
        <tr>
            <th>Name</th>
            <th>Address</th>
            <th>ZIP</th>
            <th>City</th>
            <th>Country</th>
            <th>Telephone</th>
        </tr>
        <xsl:for-each select="Companies/row">
        <tr>
            <td><xsl:value-of select="@Name"/></td>
            <td><xsl:value-of select="@Address"/></td>
            <td><xsl:value-of select="@ZIP"/></td>
            <td><xsl:value-of select="@City"/></td>
            <td><xsl:value-of select="@Country"/></td>
            <td><xsl:value-of select="@Telephone"/></td>
        </tr>
        </xsl:for-each>
    </table>
    </body>
    </html>
</xsl:template>
</xsl:transform>

Я думал что-то вроде

<th colspan="{count(//table/tr[last()]/td)}">Companies</th>

но то, что, вы знаете,... работает. Я в первый день изучаю XSLT, поэтому, пожалуйста, держитесь со мной, если вам не хватает моего понимания.

Хорошо зная, что я пытаюсь здесь (настройка colspan), конечно, тривиально, я пытаюсь задаться основным вопросом, xslt применение XPath на себя.

1 ответ

Решение

Вы не за горами, но выражение должно учитывать структуру вашего входного XML:

colspan="{count(//Companies/row[last()]/@*)}"

В вашем входном XML нет table, tr а также td элементы.

Я понимаю, что вы пытались подсчитать ячейки таблицы, которые генерируются в вашей таблице стилей XSLT, но эта информация также может быть получена из вашего входного XML, и это более просто.


Кроме того, мне интересно, почему вы хотите динамически подсчитывать количество ячеек в одном месте, если вы жестко кодируете атрибуты, которые должны быть превращены в ячейки таблицы в другом?

РЕДАКТИРОВАТЬ: Оказывается, вы намеревались спросить о теоретической возможности доступа к узлам текущей таблицы стилей. Да, есть способы сделать это.

XSLT 1.0

Если вы ограничены XSLT 1.0, используйте document() функция, но без указания URI для разрешения:

<xsl:value-of select="count(document('')//td)"/>

"Справочник программиста по XSLT 2.0" Майкла Кея гласит:

[document ('')] относится к самой таблице стилей. Эта конструкция часто использовалась с XSLT 1.0, где она предоставляла удобный способ поддерживать таблицы поиска в самой таблице стилей.

Посмотрите, например, этот похожий вопрос.

XSLT 2.0

Хранить информацию о том, какие атрибуты должны быть превращены в ячейки таблицы в xsl:variable элемент. Затем получите доступ к его содержимому как для генерации таблицы, так и для определения значения colspan приписывать.

На самом деле, это можно сделать и в XSLT 1.0, если у вас есть средство для преобразования фрагмента результирующего дерева в набор узлов (например, с помощью функции EXSLT).

Другие вопросы по тегам