Как проверить соответствие в xsl: apply-template? - PullRequest
4 голосов
/ 22 августа 2011

Во втором совпадении с шаблоном xsl: как мне проверить соответствие шаблону?Например, если паттер совпадения - заголовок, я хочу вывести другое значение?

  <xsl:template match="secondary-content">
    <div class="secondary">
      <xsl:apply-templates select="title" />
      <xsl:apply-templates select="block/content | content" />
    </div>
  </xsl:template>
  <xsl:template match="title|content|block/content">
    <xsl:copy-of select="node()" />
  </xsl:template>

Ответы [ 3 ]

3 голосов
/ 23 августа 2011

Почему бы не разделить его на два отдельных правила шаблона? Кажется странным иметь одно шаблонное правило для обработки нескольких случаев, когда логика различна для разных случаев. Используйте отдельные правила, и если логика сложная, добавьте общую / общую логику в именованный шаблон (или, если вы чувствуете амбициозность, используйте xsl: next-match или xsl: apply-import для общей логики).

3 голосов
/ 22 августа 2011

Хороший вопрос, + 1.

Во втором шаблоне используйте это тестовое выражение:

test="self::title"

или

test="local-name() = 'title'"

Например, вы можете использовать

<xsl:choose>
  <xsl:when test="self::title">
    <someThing>foo</someThing>
  </xsl:when>
  <xsl:otherwise>
    <xsl:copy-of select="node()" />
  </xsl:otherwise>
</xsl:choose>
2 голосов
/ 23 августа 2011

Почти всегда лучше не иметь условной логики в теле шаблона .

Следовательно, вместо :

<xsl:template match="title|content|block/content">
  <xsl:choose>
    <!-- conditional processing here -->
  </xsl:choose>
</xsl:template>

написать :

<xsl:template match="title">
    <!-- Some processing here -->
</xsl:template>

<xsl:template match="content|block/content">
    <!-- Some other processing here -->
</xsl:template>

Кстати, соответствие content|block/content эквивалентно короткому content.

Таким образом, последний шаблон может быть дополнительно упрощен до :

<xsl:template match="content">
    <!-- Some other processing here -->
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...