применять весь шаблон или части шаблона в зависимости от условия - PullRequest
1 голос
/ 16 февраля 2012

У меня есть шаблон

<xsl:template match="node" mode="some_mode">
    <xsl:value-of select="child1" />
    <xsl:value-of select="child2" />
    <xsl:value-of select="child3" />
</xsl:template>

Я хочу применить шаблон, чтобы он выбрал все узлы, указанные в шаблоне, в одном случае, например,

<xsl:apply-templates select="node" mode="some_node" />  <!-- select all inside the node tag  -->

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

<xsl:apply-templates select="node" mode="some_node" />  <!-- select only some tags from the node tag  -->

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

Ответы [ 3 ]

1 голос
/ 16 февраля 2012

Боюсь, это невозможно без модификации вашего шаблона. Можно подумать о сохранении выходных данных шаблона в переменной и последующей обработке для удаления значений child1 и child2. Но я полагаю, что вы не сможете угадать, какая часть вашего вывода исходит от child1 и / или child2.

Или вы можете разработать другой шаблон, который выполняет это альтернативное действие.

РЕДАКТИРОВАТЬ: Другая идея:

Возможно, можно применить фильтрацию, чтобы избавиться от child1 и child2 перед применением вашего шаблона (это было бы своего рода многопроходным преобразованием XSL).

1 голос
/ 16 февраля 2012

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

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:apply-templates mode="allChildren"/>
==========
  <xsl:apply-templates mode="child3Only"/>
 </xsl:template>

 <xsl:template match="node" mode="allChildren">
   <xsl:copy-of select="*"/>
 </xsl:template>

 <xsl:template match="node" mode="child3Only">
   <xsl:copy-of select="child3"/>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к следующему документу (аналогично тому, который вы использовали в предыдущем вопросе):

<document>
    <node>
        <child1>Child 1</child1>
        <child2>Child 2</child2>
        <child3>Child 3</child3>
    </node>
    <anotherNode />
</document>

желаемый результат получен :

<child1>Child 1</child1><child2>Child 2</child2><child3>Child 3</child3>

==========

<child3>Child 3</child3>
1 голос
/ 16 февраля 2012

Используйте инструкцию xsl: if внутри вашего шаблона для ветвления.

Пример:

<xsl:template match="node">
  <xsl:value-of select="child1" />
    <xsl:if test="price &gt; 10">
      <xsl:value-of select="child2" />
      <xsl:value-of select="child3" />
    </xsl:if>
</xsl:template>

Я надеялся на простой пример в вопросе.На первый взгляд, я не приведу простой пример, который пояснит ваш вопрос и покажет, как инструкция xsl: if является идеальным ответом.

Скажем таку вас есть такая музыкальная коллекция ...

<?xml version="1.0"?>
<catalog>
    <cd>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>

        <price>10.90</price>
        <year>1985</year>
    </cd>
    <cd>
        <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
        <country>UK</country>

        <company>CBS Records</company>
        <price>9.90</price>
        <year>1988</year>
    </cd>

</catalog>

И вы хотите вывести html-таблицу с названием и ценой списка вашего CD.Обычно вам нужны и заголовок, и цена, но при некоторых условиях (скажем, цена меньше 10 долларов) вы хотите подавить вывод цены и просто разместить на своем месте статический текст, например, «дешевле, чем 10,00».

Итак, ваш ожидаемый результат должен быть:

<?xml version="1.0" encoding="utf-8"?>
<table>
  <tr>
    <td>Empire Burlesque</td>
    <td>cheaper than 10.00</td>
  </tr>
  <tr>
    <td>Hide your heart</td>
    <td>9.90</td>
  </tr>
</table>

Таблица стилей для создания этого преобразования может быть:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

      <xsl:template match="/">
        <table>
          <xsl:apply-templates select="//cd"/>
        </table>
      </xsl:template>

      <xsl:template match="cd">
        <tr>
          <td><xsl:value-of select="title"/></td>
          <xsl:if test="price &lt; 10">
            <td><xsl:value-of select="price"/></td>
          </xsl:if>
          <xsl:if test="not(price &lt; 10)">
            <td>cheaper than 10.00</td>
          </xsl:if>
        </tr>
      </xsl:template>

</xsl:stylesheet>

И там у вас есть идеальный ответ - как применитьвесь шаблон или только его части в зависимости от условия.В этом случае условие состоит в том, что цена составляет менее $ 10.

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