как XSLT конвертировать тег внутри тега? - PullRequest
1 голос
/ 17 марта 2010

У меня есть следующий XML

<title>
    This is a <highlight>test</highlight> thanks.
</title>

и хотите конвертировать в

<span class="title">this is a <span class="highlight">test</span> thanks.</span>

Я пробую этот xslt, только могу получить текст внутри тега заголовка, как я могу также преобразовать тег подсветки?

<span class="title"><xsl:value-of select="title"/></span>

Ответы [ 2 ]

4 голосов
/ 17 марта 2010
<xsl:template match="title">
  <span class="title">
    <xsl:apply-templates />
  </span>
</xsl:template>

<xsl:template match="highlight">
  <span class="highlight">
    <xsl:apply-templates />
  </span>
</xsl:template>

или, если хотите, сверните его в один шаблон:

<xsl:template match="title|highlight">
  <span class="{name()}">
    <xsl:apply-templates />
  </span>
</xsl:template>

Ключевой точкой является <xsl:apply-templates /> - он пропускает все дочерние узлы текущего узла через соответствующие шаблоны. В верхнем варианте соответствующие шаблоны являются отдельными, в нижнем варианте один шаблон называется рекурсивным.

В XSLT определено правило по умолчанию, которое копирует текстовые узлы. Весь текст проходит через это правило <apply-templates>, поэтому текстовые узлы появляются в выводе автоматически.

2 голосов
/ 17 марта 2010

Используйте xsl:copy-of вместо xsl:value-of, если вам нужна полная копия узла и всех его дочерних элементов:

<span class="title"><xsl:copy-of select="title"/></span>

Но для того, что вы пытаетесь сделать, я бы создал один шаблон для элемента title и один для элемента highlight:

<xsl:template match="title">
     <span class="title"><xsl:value-of select="." /></span>
     <xsl:apply-templates />
</xsl:template>

<xsl:template match="highlight">
     <span class="highlight"><xsl:value-of select="." /></span>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...