LINUX.ORG.RU

XSLT. Нужен пример.

 , ,


0

1

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

Есть XML, в котором есть параметр — ссылка. Ну, например:

<p>
    <link>
        <title>Ссылка на сайт</title>
        <url>http://www.example.tld/path/to/page.html</url>
    </link>
</p>

Как из этих данных получить такой простой XHTML?

<p>
    <a href="http://www.example.tld/path/to/page.html">
        Ссылка на сайт
    </a>
    // <a href="http://www.example.tld/path/to/page.html">example.tld</a>
</p>

?

Т.е. как сделать тупую простенькую регексповую замену?

Я видел регекспы только в XSLT 2.0, который пока не понимаем xsltproc. И видел страшные, на десяток строк косвенные решения на XSLT 1.0. Неужели нельзя проще?

★★★★★

Последнее исправление: KRoN73 (всего исправлений: 1)

Расширение для xslt?

NixU
()
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="link">
    <xsl:element name="a">
      <xsl:attribute name="href"><xsl:value-of select="url"/></xsl:attribute>
      <xsl:value-of select="title"/>
    </xsl:element>
    // <xsl:element name="a">
      <xsl:attribute name="href"><xsl:value-of select="url"/></xsl:attribute>
      <xsl:value-of select="substring-before(substring-after(url, '.'), '/')"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="p">
    <xsl:element name="p">
      <xsl:apply-templates select="link"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>
anonymous
()

подобная логика это не задача XSLT, решайте ее на прикладном уровне который генерирует исходный XML

maxcom ★★★★★
()
Ответ на: комментарий от maxcom

подобная логика это не задача XSLT, решайте ее на прикладном уровне который генерирует исходный XML

Исходный XML — чистые данные. Зачем мне совать мусор, который может быть востребован шаблоном, а может быть нет? Шаблоны-то подразумеваются разные. В одном будет простое оформление, в другом — хитрое.

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

Придётся велосипедить.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Тут есть разные подходы. XSLT на может на порядок больше чем популярные ныне logic-less шаблонизаторы (вроде mustache). Да и вообще XSLT, по сути, является алгоритмически полным функциональным языком программирования.

Нужны regexp'ы — расширяй его внешними функциями, многие реализации XSLT это позволяют

maxcom ★★★★★
()

нельзя проще?

(let (  X  (body (in "/tmp/in.xml" (xml)) 'link )
          @T (caddr (assoc 'title X))
          @U (caddr (assoc 'url X)))
     (when (match '(@ "/" "/" "w" "w" "w" "." @H "/" @) (chop @U))
        (xml (fill '(p NIL (a ((href . @U)) @T ) " // " (a ((href . @U)) . @H))) 1)))

ps. Прошу простить за оффтоп, неудержался ;-)

pps. Можно ли еще проще?

anonymous
()
Ответ на: комментарий от anonymous

'(@ «/» «/» «w» «w» «w» "." @H «/» @)

скриптота

anonymous
()

использовать в качестве препроцессора saxon
или написать свою обертку для libxslt с расширениями.

Неужели нельзя проще?

риторический вопрос

chg ★★★★★
()
Ответ на: комментарий от chg

риторический вопрос

xmlstarlet, думаю, влезет в строку (будет в ~1.5 раза короче)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.