xmlhack.ru XML-форумы
Обсуждение XML и связанных с ним технологий

Вывод в XHTML фрагмента из XML


Автор Сообщение
Ronaldo
Новичок

Зарегистрирован: 20.07.2009
Сообщения: 6

[13920] Вт Июл 21, 2009 14:04
Вывод в XHTML фрагмента из XML
xml:

Код:

<library>
    <book>
        <name>C++ for dummies</name>
        <title>Пособие <a href="http://cpp4dummies.com/">C++ for dummies</a> для ВУЗов и техникумов</title>
    </book>
    <book>
        ...
    </book>
</library>



Я хочу вывести library/book/title таким образом, чтобы внутренности title вывелись как текст, чтобы в XHTML мои XML-ные теги автоматически превратились в XHTML-ные. Менять спецсимволы на XML-entities не катит - они тогда так текстом и будут в броузере, в теги не превратятся. Танцы с бубном вокруг xsl:text не помогли...
Fireball
Наставник

Зарегистрирован: 26.02.2008
Сообщения: 282

[13923] Чт Июл 23, 2009 01:47

Ммм, а можно в коде тот результат, который требуется получить?
Ronaldo
Новичок

Зарегистрирован: 20.07.2009
Сообщения: 6

[13924] Чт Июл 23, 2009 02:11

Fireball писал(а):

Ммм, а можно в коде тот результат, который требуется получить?



Ну вот если просто написать

Код:

<xsl:value-of select="/library/book[1]/title" />



то на выходе будет

Код:

Пособие C++ for dummies для ВУЗов и техникумов



А мне надо чтобы было

Код:

Пособие <a href="http://cpp4dummies.com/">C++ for dummies</a> для ВУЗов и техникумов



То есть чтобы теги дочерние теги из XML перекочевали "как есть" в XHTML, то есть в результат XSL-трансформации.
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[13927] Чт Июл 23, 2009 22:16

Код:

<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
  <xsl:template match="/">
    <xsl:apply-templates select="/library/book/title" mode="copy"/>
  </xsl:template>

  <xsl:template match="title" mode="copy">
    <xsl:apply-templates select="@*" mode="copy"/>
    <xsl:apply-templates mode="copy"/>
  </xsl:template>

  <xsl:template match="@*" mode="copy">
    <xsl:attribute name="{local-name()}">
      <xsl:value-of select="."/>
    </xsl:attribute>
  </xsl:template>

  <xsl:template match="text()" mode="copy">
    <xsl:value-of select="."/>
  </xsl:template>

  <xsl:template match="*" mode="copy">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates select="@*" mode="copy"/>
      <xsl:apply-templates mode="copy"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>


_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
Ronaldo
Новичок

Зарегистрирован: 20.07.2009
Сообщения: 6

[13929] Пт Июл 24, 2009 08:52

Vasilisk, спасибо, все работает как надо!

А можешь рассказать в двух словах что здесь происходит? Я думал это будет как-то проще Smile

PS. С XPath я уже разобрался.
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[13934] Вс Июл 26, 2009 20:19

Применение шаблонов копирования к элементам, атрибутам и тектовым узлам
_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
Fireball
Наставник

Зарегистрирован: 26.02.2008
Сообщения: 282

[13938] Пн Июл 27, 2009 11:46

Ronaldo писал(а):

А можешь рассказать в двух словах что здесь происходит? Я думал это будет как-то проще Smile


На самом деле, просто вместо

Код:

<xsl:value-of select="/library/book[1]/title" />


нужно было вставлять внутренности title, xsl:value-of как раз всегда превращает в текст то, что вставляешь.

Код:

<xsl:apply-templates select="/library/book[1]/title/node()" />


А Vasilisk просто все очень подробно расписал.
Ronaldo
Новичок

Зарегистрирован: 20.07.2009
Сообщения: 6

[13941] Пн Июл 27, 2009 19:53

Fireball, у меня вот такой вариант:

Код:

<xsl:apply-templates select="/library/book[1]/title/node()" />



съедает все внутренние теги - на выходе голый текст (слепленные текстовые узлы).
Fireball
Наставник

Зарегистрирован: 26.02.2008
Сообщения: 282

[13944] Вт Июл 28, 2009 16:38

Нужно полностью XML и шаблон смотреть, так сложно сказать.