XSLT:在“长”字中添加空格

时间:2010-03-31 11:11:53

标签: xslt word spaces divide

有一个代码:

<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

2 个答案:

答案 0 :(得分:3)

以下是您可以使用Saxon 9AltovaXML tools运行的XSLT 2.0样式表:

<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>

答案 1 :(得分: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>