#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
В средах XSLT 1 вы часто можете обращаться к базовой платформе (например, Java или .NET или PHP или Python), чтобы использовать аналогичные строковые функции, поддерживающие регулярные выражения, такие как
, '')"/>
</xsl:copy>
</xsl:template>
.s*$
сопоставление в конце строки, которой предшествует ноль или более пробельных символов, которым предшествует один символ полной остановки.
Или попробуйте сделать все это с помощью чистых строковых функций XPath 1
Во всех случаях обрабатывайте копирование других материалов с помощью шаблона преобразования идентификатора: https://xsltfiddle .liberty-development.net/jxNakAW