长字符串中的 & 实体会使模板出现故障

ampersand entities in long strings make template malfunction

我正在使用在 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>&amp;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>&amp;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。

您已正确地将文本分成四段,每段长度为 23 个字符,并且已正确地以其正确的 XML 表示法表示了这 23 个字符的字符串中的每一个。

如果他们无法处理,那一定是因为他们没有使用符合规范的 XML 解析器正确处理 XML,所以问题出在他们身上,而不是在你身上.