Когда я нажимаю на шаблон «строка» (часть разметки пользовательской таблицы), я устанавливаю некоторую переменную или передаю некоторый параметр, который для каждого шаблона, примененного впоследствии, будет знать, что он находится в «строке», исделать что-то особенное на основе этой информации.Я знаю, что не могу добавить параметры к apply-шаблонам.Возможно, я смогу добавить строку «mode», но я не могу вносить изменения в каждый шаблон и иметь одну копию с параметром mod, а другую без.
Для начала, параметры можно передать шаблонам , которые выбраны для обработки инструкцией <xsl:apply-templates>
.Читайте о <xsl:with-param>
.
Однако, передача такого параметра обычно не требуется .Вот пример:
Если шаблон соответствует определенному (текущему) узлу и он должен действовать особым образом в зависимости от того, находится ли этот узел в строке таблицы, то это вопрос простой проверки:
parent::tr
выбирает родительский узел, только если это tr
.
ancestor::tr
выбирает всех предков tr
узлов .
В случае, если первое или второе приведенное выше выражение XPath выбирает непустой набор узлов, то (соответственно) родительский элемент текущего узла равно a tr
, или текущий узел находится в пределах некоторого tr
.
Итак, вы можете использовать <xsl:when>
для проверки этого .
Вот как может выглядеть законченное решение :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="checkbox">
<xsl:choose>
<xsl:when test="ancestor::tr">
<myTag><xsl:copy-of select="."/></myTag>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
, когда это преобразование применяется к следующему документу XML :
<t>
<checkbox>1</checkbox>
<table>
<tr>
<td><checkbox>1</checkbox></td>
</tr>
</table>
</t>
желаемый, правильный результат получается :
<checkbox>1</checkbox>
<myTag>
<checkbox>1</checkbox>
</myTag>
Очень часто условные инструкции можно полностью исключить, указав spСобственные шаблоны с предикатами в шаблоне совпадения .Если вы предоставите необходимую соответствующую информацию, люди смогут опубликовать элегантное решение.