XSLT:在“长”文本中添加空格单词

发布于 2024-08-27 01:47:30 字数 1516 浏览 11 评论 0原文

有一个代码:

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

意义在于分隔“长”单词用空格 。在该单词的每个字母后面添加空格。然后有必要在带有“spaced”类的标签中结束这个单词。

如果该单词中的字母数量超过 10 个(例如,可以设置任何值),则该单词被认为是“长”。

xslt这个问题怎么解决呢?

There is a code:

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

It is necessary to receive:

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

The sense consists in dividing "long" words with spaces. To put space after each letter in such word. Then it is necessary to conclude this word in a tag with a class "spaced".

The word is considered "long" if the quantity of letters in this word is more 10 (for example. It is possible to set any value).

How to solve this problem means xslt?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

隐诗 2024-09-03 01:47:30

这是一个 XSLT 2.0 样式表,您可以使用 Saxon 9AltovaXML 工具

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

Here is an XSLT 2.0 stylesheet that you could run with Saxon 9 or with 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>
酒浓于脸红 2024-09-03 01:47:30

非常聪明的人促使我做出了这个决定,对他们非常感谢。 在 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) > 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) > 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>

Very clever people have prompted me the decision, huge to them thanks. Works in xslt 1.0 without any extansions. It is not my solution.

<?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) > 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) > 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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文