XSLT 1.0给定字符串如果位置在该字之前是空格,则断开给定位置

时间:2016-10-06 05:52:11

标签: html css xml xslt

我是XSLT的新手,我在xslt上阅读了一些内容。我无法实现解决方案。

我的意见是这样的。

<?xml version="1.0"?>
<root>
 <line1>Hello world, XSLT is Functional programming? additional info</line1>
</root>

必需的输出

<line1>Hello world, XSLT is<br/>Functional programming?<br/>additional info</line1>

我的条件是 <DIV width="20pt">的总大小我需要根据20个字符的最大大小来打破字符串IF字符串位置是20包含空格分隔并继续到下一个,否则如果字符串位置是19包含空格分隔与19位置。

对不起英语非常糟糕。

让我知道这可以在XSLT中完成,这里的变量是不可变的。我无法追加价值观。

任何提示都是......

谢谢, Umesha

2 个答案:

答案 0 :(得分:1)

在XSLT 1.0中,您可以使用递归模板通过检查20或21位置是否有空格来拆分字符串。 (或者如果长度首先小于20)

试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />

    <xsl:template match="text()[normalize-space()]" priority="2">
        <xsl:call-template name="split" />
    </xsl:template>

    <xsl:template name="split">
        <xsl:param name="text" select="."/>
        <xsl:param name="limit" select="20" />
        <xsl:choose>
            <!-- Text length is less than or equal 20 characters -->
            <xsl:when test="string-length($text) &lt;= $limit">
                <xsl:value-of select="$text" />
            </xsl:when>
            <!-- 20th or 21st character is a space -->
            <xsl:when test="contains(substring($text, $limit, 2), ' ')">
               <xsl:value-of select="substring($text, 1, $limit)" /> 
               <br />
               <xsl:call-template name="split">
                   <xsl:with-param name="text" select="normalize-space(substring($text, $limit + 1))" />
               </xsl:call-template>
            </xsl:when>
            <!-- Find first space after 20th character and split on that -->
            <xsl:otherwise>
               <xsl:value-of select="substring($text, 1, $limit)" />  
               <xsl:value-of select="substring-before(substring(concat($text, ' '), $limit + 1), ' ')" /> 
               <br />
               <xsl:call-template name="split">
                   <xsl:with-param name="text" select="substring-after(substring($text, $limit + 1), ' ')" />
               </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

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

答案 1 :(得分:-1)

根据评论进行编辑。

如果您有权访问xslt 2.0,则可以使用以下替换功能。

<line1>
    <xsl:analyze-string select="."  regex=".{{1,20}}\s" flags="x">
      <xsl:matching-substring>
         <xsl:value-of select="."/>     
         <br>     
       </xsl:matching-substring>
       <xsl:non-matching-substring>
       </xsl:non-matching-substring>
      </xsl:analyze-string>
    </line1>

。{{1,20}} [\ s]以贪婪的方式(尽可能多)创建1到20个字符的捕获组,然后是[\ s]任何类型的空格。使用analyze-string函数,我们选择任何匹配的子字符串,并在其后添加<br/>

此示例导致

<line1>Hello world, XSLT is <br/>Functional <br/>programming? <br/>additional <br/></line1>