2010-03-31 4 views
1

Существует код:XSLT: Append пробелы в "длинных" слово

<p> 
    Lorem ipsum dolor sit ametconsecteturadipisicing elit, 
    sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
    Ut enim ad minim veniam, quis nostrud exercitation ullamco 
    laboris nisi ut aliquip ex ea commodo consequat. 
    Duis aute iruredolorinreprehenderit in voluptate 
    velit esse cillum doloreeufugiatnullapariatur. Excepteur sint 
    occaecat cupidatat non proident, sunt in culpa qui officia 
    deserunt mollit anim id est laborum. 
</p> 

Необходимо получить:

<p> 
    Lorem ipsum dolor sit <span class="spaced">a m e t c o n s e c t e t u r a d i p i s i c i n g</span> elit, 
    sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
    Ut enim ad minim veniam, quis nostrud exercitation ullamco 
    laboris nisi ut aliquip ex ea commodo consequat. 
    Duis aute <span class="spaced">i r u r e d o l o r i n r e p r e h e n d e r i t</span> in voluptate 
    velit esse cillum <span class="spaced">d o l o r e e u f u g i a t n u l l a p a r i a t u r</span>. Excepteur sint 
    occaecat cupidatat non proident, sunt in culpa qui officia 
    deserunt mollit anim id est laborum. 
</p> 

Смысл заключается в деления «долго "слова с пробелами. Поместить пробел после каждой буквы в таком слове. Затем необходимо, чтобы заключил это слово в теге с классом «разнесенный».

Слово считается «длинным», если количество букв в этом слове больше 10 (например, можно установить любое значение).

Как решить эту проблему означает xslt?

ответ

0

Очень умные люди подсказали мне решение, огромное им спасибо. Работает в xslt 1.0 без каких-либо расширений. Это не мое решение.

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns="http://www.w3.org/1999/xhtml"> 
     <xsl:output method="xml" media-type="text/xhtml" version="1" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" indent="yes" encoding="UTF-8" omit-xml-declaration="yes"/> 

    <xsl:template match="p"> 
     <p> 
     <xsl:call-template name="tokens"> 
      <xsl:with-param name="str" select="text()" /> 
     </xsl:call-template> 
     </p> 
    </xsl:template> 

    <xsl:template name="tokens"> 
     <xsl:param name="str" /> 
     <xsl:choose> 
     <xsl:when test="contains($str, ' ')"> 
      <xsl:call-template name="checklength"> 
      <xsl:with-param name="str" select="substring-before($str, ' ')" /> 
      </xsl:call-template> 
      <xsl:call-template name="tokens"> 
      <xsl:with-param name="str" select="substring-after($str, ' ')"/> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:call-template name="checklength"> 
      <xsl:with-param name="str" select="$str" /> 
      </xsl:call-template> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

    <xsl:template name="checklength"> 
     <xsl:param name="str" /> 
     <xsl:choose> 
     <xsl:when test="string-length($str) &gt; 10"> 
      <span class="spaced"> 
      <xsl:call-template name="insertspaces"> 
       <xsl:with-param name="str" select="$str" /> 
      </xsl:call-template> 
      </span> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$str" /> 
     </xsl:otherwise> 
     </xsl:choose> 
     <xsl:text> </xsl:text> 
    </xsl:template> 

    <xsl:template name="insertspaces"> 
     <xsl:param name="str" /> 
     <xsl:choose> 
     <xsl:when test="string-length($str) &gt; 1"> 
      <xsl:value-of select="substring($str, 1, 1)" /><xsl:text> </xsl:text> 
      <xsl:call-template name="insertspaces"> 
      <xsl:with-param name="str" select="substring($str, 2, string-length($str) - 1)" /> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$str" /> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 
3

Вот XSLT 2.0 таблицы стилей, которые вы могли бы работать с Saxon 9 или AltovaXML tools:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xsd" 
    version="2.0"> 

    <xsl:param name="l" as="xsd:integer" select="10"/> 
    <xsl:variable name="regex1" as="xsd:string" select="concat('\w{', $l, ',}')"/> 

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

    <xsl:template match="p/text()"> 
    <xsl:analyze-string select="." regex="{$regex1}"> 
     <xsl:matching-substring> 
     <span class="space"> 
      <xsl:value-of select="for $ c in string-to-codepoints(.) return codepoints-to-string($c)" 
         separator=" "/> 
     </span> 
     </xsl:matching-substring> 
     <xsl:non-matching-substring> 
     <xsl:value-of select="."/> 
     </xsl:non-matching-substring> 
    </xsl:analyze-string> 
    </xsl:template> 

</xsl:stylesheet> 
+0

@Martin Honnen, этот код будет работать только на процессоре, поддерживающем XSLT 2.0? Есть ли решение на XSLT 1.0? У нас не было XSLT 2.0 на нашем сервере. – Kalinin

+0

Вам действительно понадобится процессор XSLT 2.0 для запуска этой таблицы стилей. Что касается чистого решения XSLT 1.0, у меня его нет. Как вы видите, решение XSLT 2.0 использует регулярные выражения, которые чистый XSLT 1.0 вообще не поддерживает. Если вы действительно хотите решить это с помощью XSLT 1.0, я бы хотя бы проверил, поддерживают ли ваши процессоры XSLT 1.0 регулярные выражения в качестве расширения. –

+0

libxslt Версия \t 1.1.17, libxslt скомпилирован против libxml Версия \t 2.6.26, EXSLT - enabled, libexslt Версия - 1.1.17. это наши настройки xslt на сервере. – Kalinin

Смежные вопросы