Как я могу удалить конечную точку (точку) из текстовых узлов

#xslt #xslt-1.0 #xslt-2.0

#xslt #xslt-1.0 #xslt-2.0

Вопрос:

если у меня есть текстовый узел с конечной точкой (или точкой в английском языке США), какое выражение я могу использовать, чтобы удалить точку и оставить остаток?

например, ввод

 <ol>
<li>This is the first item.</li>
<li>This is the second</li>
<li>This is the 3rd. </li>
</ol> 
 

требуемый вывод

 <ol>
<li>This is the first item</li>
<li>This is the second</li>
<li>This is the 3rd</li>
</ol>  
 

У меня есть это, но это кажется излишне громоздким

 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <xsl:apply-templates select="ol"/>
    </xsl:template>
    
    <xsl:template match="ol">
        <ol>
            <xsl:apply-templates select="li"/>
        </ol>
    </xsl:template>
    
    <xsl:template match="li">
        <li><xsl:apply-templates select="text()" mode="clean-text"/></li>
    </xsl:template>
    
    <xsl:template match="text()" mode="clean-text">
        <xsl:variable name="normal-text" select="normalize-space(.)"/>
        <xsl:choose>
            <xsl:when test="substring($normal-text,string-length($normal-text),1) = '.'"><xsl:value-of select="normalize-space(substring($normal-text,1,string-length($normal-text)-1))"/></xsl:when>
            <xsl:otherwise><xsl:value-of select="$normal-text"/></xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>
 

Есть ли более умный способ добиться того же?
Кстати, я использую версию v1.0, поскольку это может быть создано в среде Microsoft.
Но решение версии 2.0 также будет представлять интерес

TIA

Комментарии:

1. На самом деле то, что у вас есть, неплохо. Преимущество заключается в том, что пробелы нормализуются только один раз. Что является «громоздким», так это все остальные шаблоны, которые могут быть заменены шаблоном преобразования идентификатора .

2. Но преобразование идентификаторов заменит только шаблоны root и ol, не так ли?

3. Нет, он может заменить все ваши шаблоны, кроме последнего, для которого может быть шаблон соответствия li/text() (и режим не требуется).

Ответ №1:

В XSLT 2 или 3 у вас есть replace функция:

   <xsl:template match="ol/li[ends-with(normalize-space(.), '.')]">
      <xsl:copy>
          <xsl:value-of select="replace(., '.s*

В средах XSLT 1 вы часто можете обращаться к базовой платформе (например, Java или .NET или PHP или Python), чтобы использовать аналогичные строковые функции, поддерживающие регулярные выражения, такие как  .s*$  сопоставление в конце строки, которой предшествует ноль или более пробельных символов, которым предшествует один символ полной остановки.

Или попробуйте сделать все это с помощью чистых строковых функций XPath 1

   <xsl:template match="ol/li[substring(normalize-space(), string-length(normalize-space())) =  '.']">
      <xsl:copy>
          <xsl:value-of select="substring(normalize-space(), 1, string-length(normalize-space()) - 1)"/>
      </xsl:copy>
  </xsl:template>
 

Во всех случаях обрабатывайте копирование других материалов с помощью шаблона преобразования идентификатора: https://xsltfiddle .liberty-development.net/jxNakAW


, '')"/>
</xsl:copy>
</xsl:template>
В средах XSLT 1 вы часто можете обращаться к базовой платформе (например, Java или .NET или PHP или Python), чтобы использовать аналогичные строковые функции, поддерживающие регулярные выражения, такие как .s*$ сопоставление в конце строки, которой предшествует ноль или более пробельных символов, которым предшествует один символ полной остановки.

Или попробуйте сделать все это с помощью чистых строковых функций XPath 1


Во всех случаях обрабатывайте копирование других материалов с помощью шаблона преобразования идентификатора: https://xsltfiddle .liberty-development.net/jxNakAW