Интересная дилемма XSL - PullRequest
       1

Интересная дилемма XSL

1 голос
/ 01 января 2011

У меня есть эта проблема.

Шаблон с именем "checkbox", который вызывается как внутри элемента HTML таблицы, так и вне его.

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

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

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

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

Спасибо!

Добавление:

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

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

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

Надеюсь, это понятнее.

Ответы [ 3 ]

2 голосов
/ 01 января 2011

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

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

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

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

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

1 голос
/ 01 января 2011

Когда я нажимаю на шаблон «строка» (часть разметки пользовательской таблицы), я устанавливаю некоторую переменную или передаю некоторый параметр, который для каждого шаблона, примененного впоследствии, будет знать, что он находится в «строке», исделать что-то особенное на основе этой информации.Я знаю, что не могу добавить параметры к 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Собственные шаблоны с предикатами в шаблоне совпадения .Если вы предоставите необходимую соответствующую информацию, люди смогут опубликовать элегантное решение.

0 голосов
/ 01 января 2011

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

Это ограничения 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>

Не забудьте добавить в этот шаблон ваши правила, соответствующие более конкретным элементам.

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