2012-04-26 2 views
1

В настоящее время у меня простая разметка, которая в основном представляет HTML.Отображение дочерних узлов

Ниже приведен фрагмент этого

<li>Make this <b>Bold</b></li> 

Я могу, конечно, использовать <xsl:copy-of>, чтобы гарантировать, что <b> тег передается через и автоматически отображается жирным шрифтом, однако у меня есть проблема.

Я использую другой XSL, который проверяет разметку на репозиторий ключевых слов или фраз, и если они существуют, создаются ссылки.

Ниже мой XSL

<xsl:template name="List" match="li"> 
    <li> 
      <xsl:call-template name="markup"> 
      <xsl:with-param name="text" select="."/> 
      <xsl:with-param name="phrases" select="document('../../documents/main/keywords.xml')/keywords/keyword"/> 
      <xsl:with-param name="first-only" select="false()"/> 
      </xsl:call-template> 
    </li> 
    </xsl:template> 

Этот метод предотвращает любые дочерние теги пропускают через, однако я не уверен, о том, как я могу обойти эту проблему.

Любая помощь очень ценится! Dan

+0

Не могли бы вы дать дополнительную информацию о том, что делает шаблон _markup_? В настоящее время я не вижу причин, по которым теряются дочерние элементы элементов _li_. Поскольку вы передаете весь элемент _li_ в шаблон (''), Все потомки должны быть доступны в шаблоне. – Martin

+0

Я использую markup.xsl, доступный с http://www.jenitennison.com. По существу markup.xsl просматривает репозиторий ключевых слов (keywords.xml) и сравнивает его с просматриваемым документом, если он выполняется, он будет использовать следующий код: \t \t \t

+0

http://www.jenitennison.com/xslt/utilities/markup.xml –

ответ

1

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

Правильная вещь - с использованием шаблона идентификации и создания выделенного шаблона для потомков текстовых узлов <li> элементов.

Попробуйте это:

<xsl:variable 
    name="keywords" 
    select="document('../../documents/main/keywords.xml')/keywords/keyword" 
/> 

<!-- the identity template does copies of everything not matched otherwise --> 
<xsl:template match="node() | @*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node() | @*" /> 
    </xsl:copy> 
</xsl:template> 

<!-- text nodes in <li> elements get special treatment --> 
<xsl:template match="li//text()"> 
    <xsl:call-template name="markup"> 
    <xsl:with-param name="phrases" select="$keywords"/> 
    <xsl:with-param name="first-only" select="false()"/> 
    </xsl:call-template> 
</xsl:template> 

<!-- marks up the current node --> 
<xsl:template name="markup"> 
    <xsl:with-param name="phrases" /> 
    <xsl:with-param name="first-only" select="true()" /> 

    <!-- you can use . here - no need to pass in a $text param --> 
</xsl:template> 

Шаблон идентичности является ключом к успешному решению проблем, как этот. Он управляет копированием <li> и <b> прозрачно.

  1. Он выполняет полный обход ввода, копируя его, если более конкретный шаблон не соответствует текущему узлу.
  2. Это означает, что вам нужно только написать шаблоны для узлов, которые вы хотите изменить. В этом случае соответствие текстовых узлов работает лучше всего, так как они не могут иметь вложенных детей.
  3. Избегайте названных шаблонов, таких как <xsl:template name="List">. Это «стиль push» XSLT, т. Е. Он необходим и часто приводит к довольно неуклюжим результатам.
  4. <xsl:template match="li//text()">тянет узлов из потока и делает что-то более сложное, чем просто копирование их. Это «стиль притяжения» XSLT, т. Е. Сопоставление шаблонов. Обычно его проще обрабатывать и производить более чистый XSLT-код.
  5. Вы не ограничены текстовыми узлами в пределах <li> элементов, конечно. Просто измените выражение соответствия, чтобы воздействовать на другие узлы.

Допустим, вы хотите, чтобы включить все <b> узлы в <strong> без нарушения каких-либо других шаблонов. С выдвижной стиль, это так же просто, как это:

<xsl:template match="b"> 
    <strong> 
    <xsl:apply-templates select="node() | @*" /> 
    <strong> 
</xsl:template> 

отметить также, что текущий узел не изменяется, когда вы делаете <xsl:call-template>. Поэтому нет необходимости передавать текущий узел в вызываемый шаблон.

+0

You Звезда! Спасибо Вам большое. –

+0

@ Даниэль. Добро пожаловать. – Tomalak

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