преобразование xslt из xhtml в пользовательский xml - PullRequest
1 голос
/ 30 января 2010

Для пользовательского приложения мне нужно преобразовать xhtml в (custom) xml. После некоторых экспериментов я решил попробовать XSLT-функциональность php5, но пока не могу преобразовать вложенные p-теги в их xml-эквивалент.

В основном у нас есть такой код:

<p>Some text</p>
<ol>
   <li><p>Some more text</p></li>
   ..
</ol>

Это должно быть преобразовано в:

<par>Some text</par>
<list>
  <li><par>Some more text</par></li>
  ..
</list>

Реальная проблема заключается в следующем: мне нужно включить встроенные теги, поэтому xsl: value-of не является опцией, и вместо этого я использую xsl: copy-of. Пока у меня есть шаблоны для ol | ul и p, и результат такой:

<par>Some text</par>
<list>
  <li><p>Some more text</p></li>
  ..
</list>

Кто-нибудь дает несколько советов, как добиться того, чего я действительно хочу, просто используя более сложный xslt?

Ответы [ 3 ]

1 голос
/ 30 января 2010

Вот, пожалуйста ...

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" indent="yes"/>
    <!-- ============================================== -->
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>
    <!-- ============================================== -->
    <xsl:template match="p">
        <xsl:element name="par">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
    <!-- ============================================== -->
    <xsl:template match="ol">
        <xsl:element name="list">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
    <!-- ============================================== -->
    <xsl:template match="li">
        <xsl:element name="li">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
    <!-- ============================================== -->
</xsl:stylesheet>
1 голос
/ 30 января 2010

Если вы начнете с тождественного преобразования , общий шаблон преобразования элементов с одним именем в элементы другого выглядит так:

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

Две вещи на заметку:

  1. Как правило, если вы точно не знаете, что преобразовываемый элемент не имеет атрибутов (или вы активно намереваетесь удалить атрибуты), вы должны использовать показанный атрибут select; не просто используйте <xsl:apply-templates/>. Атрибуты не являются дочерними узлами, и поэтому применение шаблонов без атрибута select не применяет к ним шаблоны.

  2. Если вы действительно не любите печатать, почти нет причин использовать <xsl:element>. Исключение составляют случаи, когда вы генерируете имя выходного элемента программно.

Что, собственно, вы могли бы сделать, если бы хотели получить всю причудливость:

<xsl:template match="*">
   <xsl:variable name="new_name">
      <xsl:when test="name()='p'>par</xsl:when>
      <xsl:when test="name()='ol'>list</xsl:when>
      <xsl:when test="name()='li'>item</xsl:when>
      <xsl:otherwise><xsl:value-of select="name()"/></xsl:otherwise>
   </xsl:variable>
   <xsl:element name="{$new_name}">
      <xsl:apply-templates select="@*|node()"/>
   </xsl:element>
</xsl:template>
0 голосов
/ 30 января 2010

Вы можете использовать вложенные теги <xsl:element> для вывода встроенных тегов по вашему предложению.

Что-то вроде:

<xsl:element name="li">
  <xsl:element name="p">
   some text
  </xsl:element>
</xsl:element>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...