2010-12-31 3 views
1

У меня эта проблема.Интересная дилемма XSL

Шаблон под названием «checkbox», который вызывается изнутри HTML-элемента таблицы, а также за его пределами.

Чтобы решить проблему, я добавил <td> теги в элемент управления «checkbox».

Вот что я хотел бы сделать, но я не уверен, возможно ли это или нет.

Когда я ударил свой шаблон «строка» (часть шаблона пользовательской таблицы), я бы установил некоторую переменную или передал некоторый параметр, который для каждого последующего шаблона знал бы, что он был в «строке» и что-то делать на основе этой информации. Я знаю, что я не могу добавлять параметры к шаблонам apply-templates. Я могу добавить строку «режим», но я не могу вносить изменения в каждый шаблон и иметь одну копию с параметром mod и без нее.

Спасибо за любые предложения. Я знаю, что идеальным решением было бы внести изменения в XML, но я не уверен, могу ли я это сделать как этот пункт. Это проблема с содержанием. : P

Спасибо!

Добавление:

Я буду стараться, чтобы лучше объяснить мою проблему.

У меня есть этот шаблон под названием «флажок». Иногда мне нужен тег, окружающий вызов, который делает флажок, иногда я этого не делаю. Временами, когда я делаю шаблон «checkbox», вызывается, когда его родители вызываются вызовом шаблона «row» для применения шаблонов (это переводится как a, поэтому необходимо для управления форумом checkbox).

Проблема в том, что мне нужно иметь возможность повторно использовать шаблон флажка в обоих случаях: 1) Когда он не вызывается шаблоном строки и когда он вызывается шаблоном строки.

Я надеюсь, что это яснее.

+0

Я знаю, почему это важно, но иногда это просто неразумно делать это. Я не могу опубликовать целые куски кода с нашей базы кода в Интернете, и, хотя я могу придумать более простой пример, часто проблемы скрываются в окружающем его. Вот почему я пошел с объяснением длины текста. – bobber205

+0

Вы говорите, что мое текстовое объяснение не хорошо? Я думаю, что код публикации будет более запутанным. У вас есть какие-либо вопросы для разъяснения, кроме «почтового кода»? Я попытаюсь придумать какой-нибудь умный способ продемонстрировать проблему, не публикуя огромные куски кода, но я бы скорее попытался объяснить это ясно. – bobber205

+0

Я не могу сделать заголовок или хвост вашего текстового объяснения. –

ответ

1

Когда я ударил «ряд» (часть пользовательской таблицу разметки) шаблон, я бы установить некоторые переменные или передать некоторые параметр, который для каждого шаблона применяется впоследствии, знал бы он был в «строка» и сделать что-то специальное на основе этой информации. Я знаю, что не может добавлять параметры к apply-templates. Я могу добавить строку «режим», но я не могу вносить изменения в каждый шаблон и иметь одну копию с параметром мод и одним без.

Начнем с того, параметры могут быть переданы шаблоны, которые выбраны для обработки с помощью <xsl:apply-templates> инструкции. Читайте о <xsl:with-param>.

Однако прохождение такого параметра обычно не требуется. Ниже приведен пример:

Если шаблон совпадает с заданным (текущий) узел и он должен действовать особым образом в зависимости от того, этот узел находится в пределах строки таблицы, то это вопрос простой проверки:

parent::tr

выбирает родительский узел только в том случае, если он является tr.

ancestor::tr

выбирает все узлы предка tr.

В случае, когда первый или второе XPath выражений выше выбирает непустой набор узлов, а затем (соответственно), родитель текущего узла является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> 

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

+0

Я использую bobber205

+0

Это дает мне желаемые результаты, но мне не разрешено помещать или любые теги html в оператор if. Я уверен, что есть способ обойти это, но не уверен в этом. – bobber205

+0

@ bobber205: Вы можете * иметь 'td' (или любую другую разметку) внутри' '. Я хотел бы использовать '' и две инструкции '', чтобы иметь дело с двумя отдельными случаями. Узнайте больше о '', '' и '' или задайте новый вопрос с этой конкретной проблемой - преобладающее большинство тегов xslt может предоставить вам правильный ответ. –

2

Вы можете вызвать шаблон с определенным «режимом»:

<xsl:apply-templates select="*" mode="row"/> 

Но также можно применять шаблоны с параметрами:

<xsl:apply-templates select="*"> 
    <xsl:with-param name="mode" select="'row'"/> 
</xsl:apply-templates> 

Последний подход работает, по крайней мере, если все шаблоны которые могут соответствовать элементам, к которым они применяются ('*' в этом случае) объявить параметр с именем 'mode'.

+0

Использует ли второй образец кода все шаблоны и передает атрибут режима в шаблон строки? – bobber205

+0

«Последний подход работает, по крайней мере, если все шаблоны, которые могут соответствовать элементам, к которым они применяются ('*' в этом случае, объявляют параметр с именем« mode ».» Это то, чего я не могу сделать. – bobber205

0

Когда я ударил «ряд» (часть пользовательской таблицу разметки) шаблон, я бы установить некоторые переменные или передать некоторые параметр, который для каждого шаблона применяется впоследствии, знал бы он был в «строка» и сделать что-то специальное на основе этой информации. Я знаю, что не может добавлять параметры к apply-templates. Я могу добавить строку «режим», но я не могу вносить изменения в каждый шаблон и иметь одну копию с параметром мод и одним без.

Это ограничения XSLT 1.0, решены в XSLT 2.0 с помощью новых параметров обработки и туннеля mode.

В XSLT 1.0 вы можете иметь «туннелирование бедняка» перезаписью «любой элемент» встроенный правило, как:

<xsl:template match="*"> 
    <xsl:param name="mode"/> 
    <xsl:apply-templates> 
     <xsl:with-param name="mode" select="$mode"/> 
    </xsl:apply-templates> 
</xsl:template> 

Вспомните ProGate этот шаблон для ваших правил, соответствующих более конкретных элементов.

+0

Могу ли я передать режим для ТОЛЬКО шаблона флажка в функции apply-template? – bobber205

Смежные вопросы