Html XSLT 1.0给定字符串如果给定位置是空格,则在该单词之前打断该位置
我是XSLT新手,我读了一些关于XSLT的东西。我无法解决这个问题 我的输入是这样的Html XSLT 1.0给定字符串如果给定位置是空格,则在该单词之前打断该位置,html,css,xml,xslt,Html,Css,Xml,Xslt,我是XSLT新手,我读了一些关于XSLT的东西。我无法解决这个问题 我的输入是这样的 <?xml version="1.0"?> <root> <line1>Hello world, XSLT is Functional programming? additional info</line1> </root> 你好,世界,XSLT是函数式编程吗?附加信息 所需输出 <line1>Hello world, XSLT i
<?xml version="1.0"?>
<root>
<line1>Hello world, XSLT is Functional programming? additional info</line1>
</root>
你好,世界,XSLT是函数式编程吗?附加信息
所需输出
<line1>Hello world, XSLT is<br/>Functional programming?<br/>additional info</line1>
helloworld,XSLT是函数式编程?
其他信息
我的情况是
的总大小,如果字符串位置为20包含空格分隔符,则需要根据最大20个字符的大小断开字符串,然后继续下一步,否则,如果字符串位置为19包含空格分隔符,则位置为19
对不起,英语很差
让我知道这可以在XSLT中完成,这里的变量是不可变的。我不能附加这些值
有什么提示吗
谢谢,
Umesha根据评论编辑 如果您有权访问XSLT2.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函数,我们选择任何匹配的子字符串,并在其后面添加一个
这个例子的结果是
<line1>Hello world, XSLT is <br/>Functional <br/>programming? <br/>additional <br/></line1>
helloworld,XSLT是功能性的
编程吗
附加
根据评论编辑
如果您有权访问XSLT2.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函数,我们选择任何匹配的子字符串,并在其后面添加一个
这个例子的结果是
<line1>Hello world, XSLT is <br/>Functional <br/>programming? <br/>additional <br/></line1>
helloworld,XSLT是功能性的
编程吗
附加
在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) <= $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>
在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) <= $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>
任何已知的浏览器都会自行在
中分解/填充文本。这真的是插入
的要求吗?我需要在中断后进行一些缩进,因为一些电子邮件引擎没有文本缩进负数。任何已知的浏览器都会自己在
中中断/填充文本。这真的是插入
的要求吗?我需要在中断后进行一些缩进,因为某些电子邮件引擎没有文本缩进负数。如果处理器支持禁用输出转义,则可以像插入文本一样插入标记,但这绝不是一个好的解决方案。最好使用xsl:analyze字符串并将br
作为元素节点正确插入结果树中。@MichaelKay你说得对,我只关注子字符串的选择过程。我将anwser更改为使用分析字符串函数。如果处理器支持禁用输出转义,则可以像插入文本一样插入标记,但这从来不是一个好的解决方案。最好使用xsl:analyze字符串并将br
作为元素节点正确插入结果树中。@MichaelKay你说得对,我只关注子字符串的选择过程。我将anwser更改为使用分析字符串函数。