XSLT: замена символов
От: VB_Coder  
Дата: 16.11.08 12:30
Оценка:
Есть вот такой XML

<a>
   Пример текста, пример текста, пример текста, пример текста.
  <b>
    Вот еще немного текста, вложенного в другой тег.
  </b>
</a>


Задача такая, нужно символ "," заменить везде на "<c/>,"

Использовал шаблон для замены текста из книги Валикова, но ничего хорошего не вышло.
Дело в том, что у меня в символ запятой встречается во вложенном теге,
а функция substring-before убирает все теги в переданной ей строке.


 <xsl:template name="replace" match="@*|node()" mode="replace">
 
  <xsl:param name="str">
    <xsl:copy-of select="."/>
  </xsl:param>
      
  <xsl:param name="search-for" select="','"/>

  <xsl:param name="replace-with">
    <xsl:element name="c"/>
  </xsl:param>

  <xsl:choose>

    <xsl:when test="contains($str, $search-for)">
      <xsl:copy-of select="substring-before($str, $search-for)"/>      
      <xsl:copy-of select="$replace-with"/>
      <xsl:call-template name="replace">
        <xsl:with-param name="str" select="substring-after($str, $search-for)"/>
        <xsl:with-param name="search-for" select="$search-for"/>
        <xsl:with-param name="replace-with" select="$replace-with"/>
      </xsl:call-template>
    </xsl:when>

    <xsl:otherwise>
  
    <xsl:call-template name="item">
       <xsl:with-param name="item" select="$str"/>
    </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>

</xsl:template>

  <xsl:template name="item">
     <xsl:param name="item"/>
     <xsl:param name="delimeter"/>    
    <xsl:copy-of select="$item"/>
    <xsl:copy-of select="$delimeter"/>
   </xsl:template>
Re: XSLT: замена символов
От: ibnTeo Россия http://ibnteo.klava.org/
Дата: 16.11.08 22:15
Оценка:
Здравствуйте, VB_Coder, Вы писали:

VB_>Есть вот такой XML


VB_>
VB_><a>
VB_>   Пример текста, пример текста, пример текста, пример текста.
VB_>  <b>
VB_>    Вот еще немного текста, вложенного в другой тег.
VB_>  </b>
VB_></a>
VB_>


VB_>Задача такая, нужно символ "," заменить везде на "<c/>,"


VB_>Использовал шаблон для замены текста из книги Валикова, но ничего хорошего не вышло.

VB_>Дело в том, что у меня в символ запятой встречается во вложенном теге,
VB_>а функция substring-before убирает все теги в переданной ей строке.

Здесь нужно обрабатывать text() отдельно, следует использовать такой шаблон:

<xsl:template select="@*|*">
  <xsl:copy>
    <xsl:apply-templates select="text()|@*|*"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="text()">
<xsl:apply-templates select="." mode="replace">
<xsl:with-param name="..." select="..."/>
...
</xsl:apply-templates>
</xsl:template>
Re[2]: XSLT: замена символов
От: Антонш  
Дата: 18.11.08 12:20
Оценка:
T><xsl:template select="@*|*">
T> <xsl:copy>
T> <xsl:apply-templates select="text()|@*|*"/>
T> </xsl:copy>
T></xsl:template>

T><xsl:template match="text()">

T><xsl:apply-templates select="." mode="replace">
T><xsl:with-param name="..." select="..."/>
T></xsl:apply-templates>
T></xsl:template>

А вы не подскажете, как надо дополнить "...." чтобы он преобразоваывал , на <c/> ?
Re[3]: XSLT: замена символов
От: q__q  
Дата: 18.11.08 12:24
Оценка: +1
Здравствуйте, Антонш, Вы писали:

А>А вы не подскажете, как надо дополнить "...." чтобы он преобразоваывал , на <c/> ?


Попробуй функции из XSLT: http://www.exslt.org/str/functions/replace/index.html
Re[3]: XSLT: замена символов
От: ibnTeo Россия http://ibnteo.klava.org/
Дата: 18.11.08 12:48
Оценка: 3 (1) +1
T>><xsl:template select="@*|*">
T>> <xsl:copy>
T>> <xsl:apply-templates select="text()|@*|*"/>
T>> </xsl:copy>
T>></xsl:template>

T>><xsl:template match="text()">

T>><xsl:apply-templates select="." mode="replace">
T>><xsl:with-param name="..." select="..."/>
T>></xsl:apply-templates>
T>></xsl:template>

А>А вы не подскажете, как надо дополнить "...." чтобы он преобразоваывал , на <c/> ?


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

<xsl:template match="*|@*" mode="copy">
  <xsl:copy>
    <xsl:apply-templates select="*|@*|text()" mode="copy"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="text()" mode="copy">
  <xsl:call-template name="replace">
    <xsl:with-param name="text" select="."/>
  </xsl:call-template>
</xsl:template>

<xsl:template name="replace">
  <xsl:param name="text"/>
  <xsl:choose>
    <xsl:when test="contains($text, ',')">
      <xsl:value-of select="substring-before($text, ',')"/>
      <c/><xsl:text>,</xsl:text>
      <xsl:call-template name="replace">
        <xsl:with-param name="text" select="substring-after($text, ',')"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$text"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
Re[4]: XSLT: замена символов
От: alsemm Россия  
Дата: 01.12.08 16:55
Оценка:
Здравствуйте, ibnTeo, Вы писали:

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

T><xsl:template match="*|@*" mode="copy">
T>  <xsl:copy>
T>    <xsl:apply-templates select="*|@*|text()" mode="copy"/>
T>  </xsl:copy>
T></xsl:template>

T><xsl:template match="text()" mode="copy">
T>  <xsl:call-template name="replace">
T>    <xsl:with-param name="text" select="."/>
T>  </xsl:call-template>
T></xsl:template>

T><xsl:template name="replace">
T>  <xsl:param name="text"/>
T>  <xsl:choose>
T>    <xsl:when test="contains($text, ',')">
T>      <xsl:value-of select="substring-before($text, ',')"/>
T>      <c/><xsl:text>,</xsl:text>
T>      <xsl:call-template name="replace">
T>        <xsl:with-param name="text" select="substring-after($text, ',')"/>
T>      </xsl:call-template>
T>    </xsl:when>
T>    <xsl:otherwise>
T>      <xsl:value-of select="$text"/>
T>    </xsl:otherwise>
T>  </xsl:choose>
T></xsl:template>
T>

Круто. Но сильно смахивает на написание какого-нибудь std::lower_bound на ассемблере. Перходите на XSLT2.0 и забудьте про этот кошмар.

Алексей
Re[5]: XSLT: замена символов
От: Lloyd Россия  
Дата: 01.12.08 17:01
Оценка:
Здравствуйте, alsemm, Вы писали:

A>Круто. Но сильно смахивает на написание какого-нибудь std::lower_bound на ассемблере. Перходите на XSLT2.0 и забудьте про этот кошмар.


Он есть не под все платформы out-of-box, а тащить много-метровую зависимость только из-за xslt не всегда хочется.
Re[6]: XSLT: замена символов
От: alsemm Россия  
Дата: 01.12.08 17:09
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, alsemm, Вы писали:


A>>Круто. Но сильно смахивает на написание какого-нибудь std::lower_bound на ассемблере. Перходите на XSLT2.0 и забудьте про этот кошмар.


L>Он есть не под все платформы out-of-box, а тащить много-метровую зависимость только из-за xslt не всегда хочется.

Saxon есть бесплатно везде, где есть java.

Алексей
Re[7]: XSLT: замена символов
От: Lloyd Россия  
Дата: 01.12.08 17:12
Оценка:
Здравствуйте, alsemm, Вы писали:

L>>Он есть не под все платформы out-of-box, а тащить много-метровую зависимость только из-за xslt не всегда хочется.

A>Saxon есть бесплатно везде, где есть java.

Тут разве упоминалась java?
Re[5]: XSLT: замена символов
От: ibnTeo Россия http://ibnteo.klava.org/
Дата: 01.12.08 17:45
Оценка:
A>Круто. Но сильно смахивает на написание какого-нибудь std::lower_bound на ассемблере. Перходите на XSLT2.0 и забудьте про этот кошмар.

Это было бы действительно круто, но не все программируют на яве. Поэтому пока старый добрый XSLT 1.0 буду использовать.
Re[6]: XSLT: замена символов
От: alsemm Россия  
Дата: 01.12.08 19:08
Оценка:
Здравствуйте, ibnTeo, Вы писали:

A>>Круто. Но сильно смахивает на написание какого-нибудь std::lower_bound на ассемблере. Перходите на XSLT2.0 и забудьте про этот кошмар.


T>Это было бы действительно круто, но не все программируют на яве. Поэтому пока старый добрый XSLT 1.0 буду использовать.

То что XSLT 1.0 — старый, согласен, но ни никак не добрый
Не понял, зачем программировать на яве? У вас, что трансформация из приложения запускается?

Алексей
Re[8]: XSLT: замена символов
От: alsemm Россия  
Дата: 01.12.08 19:16
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, alsemm, Вы писали:


L>>>Он есть не под все платформы out-of-box, а тащить много-метровую зависимость только из-за xslt не всегда хочется.

A>>Saxon есть бесплатно везде, где есть java.

L>Тут разве упоминалась java?

В исходном сообщении про контекст использования XSLT ничего не сказано. Если надо в приложение встроить — это одно, если просто xml перегнать и результат отдать куда-то (исходники погенерить, html какой статический и т.п.) — совсем другое дело. В этом случае разницы на каком языке написан инструмент я не вижу.
Мой комментарий про java был в ответ на

Он есть не под все платформы out-of-box


Вроде бы JRE есть на всех важных платформах, так что проблем с использованием конкретного XSLT2.0 процессора на разных платформах нет.

Алексей
Re[9]: XSLT: замена символов
От: Lloyd Россия  
Дата: 01.12.08 20:16
Оценка:
Здравствуйте, alsemm, Вы писали:

A>Мой комментарий про java был в ответ на

A>

A>Он есть не под все платформы out-of-box


A>Вроде бы JRE есть на всех важных платформах, так что проблем с использованием конкретного XSLT2.0 процессора на разных платформах нет.


Под платформой обычно подразумевают язык/рантайм: java, .net, python, ryby, ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.