Может ли 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).