【发布时间】:2020-04-26 05:22:06
【问题描述】:
我正在使用在 Internet 上找到的模板将长字符串拆分成块。它似乎适用于大多数文本,但如果在这个所谓的长文本输入中有一个实体,例如“&”,它会使输出块太长。
我的这些数据消费者需要将某些实体中的长描述值分解为固定长度的片段。所以这个数据很好:
<tag>
<text>This is a long string 1This is a long string 2This is a long string 3This is a long string 4</text>
</tag>
结果输出:
<?xml version="1.0" encoding="UTF-8"?>
<tag>
<text>
<text>This is a long string 1</text>
<text>This is a long string 2</text>
<text>This is a long string 3</text>
<text>This is a long string 4</text>
</text>
</tag>
此数据在第一个输出字符串中太长了:
<tag>
<text>&This is a long string 1This is a long string 2This is a long string 3This is a long string 4</text>
</tag>
结果输出:
<?xml version="1.0" encoding="UTF-8"?>
<tag>
<text>
<text>&This is a long string </text>
<text>1This is a long string </text>
<text>2This is a long string </text>
<text>3This is a long string </text>
<text>4</text>
</text>
</tag>
我尝试将输出更改为 html,但这并没有改变行为 - 无论如何输出应该是 xml。
我实际上不确定问题是否真的可以解决,因为 XML 只是中间人,实际的源和目标最终是纯文本数据库字段,但我想将长字符串完全分块为短字符串所需的长度。
这是模板..这里所需的大小是:23
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:max="http://www.ibm.com/maximo" exclude-result-prefixes="max">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:variable name="pChunkSize" select="23" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text/text()" name="chunk">
<xsl:param name="pText" select="."/>
<xsl:if test="string-length($pText) >0">
<text>
<xsl:value-of select=
"substring($pText, 1, $pChunkSize)"/>
</text>
<xsl:call-template name="chunk">
<xsl:with-param name="pText"
select="substring($pText, $pChunkSize+1)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
我已经看到了一些关于这个的讨论,它可能是棘手的 - 因为在中间(如果它接近片段的末尾)砍掉 & 会导致无效的 XML。
【问题讨论】:
-
&amp;是表示单个字符的符号,在计算字符串长度时按此计算。<text>&amp;This is a long string </text>中字符串的长度正好是 23 个字符。当字符串被传送到其最终目的地并且未转义以供人类使用时,它将如下所示:"&This is a long string "。 -
我看到将长字符串分割成短字符串“数组”的额外要求似乎是问题所在。如果 &落在 XML 不再有效的边界上。我仍然需要找到一些可能不是技术性的合理解决方案-
-
恐怕我仍然没有看到您要解决的问题。正如我所说,
&amp;是单个字符。您使用的代码永远不会拆分它。 -
扩展被转储到输出(即 XML)中,导致 elemnr 的值比 sllowed 长
-
我们似乎在绕圈子。该元素的值不超过允许的值。如果要使用 XML,则必须接受 XML 规则。在 XML 中,
&amp;是 标记 的一部分;内容是 & 字符。如果计算实体名称的字符,为什么不计算开始<text>和结束</text>标签中的字符呢?这同样有意义。