XSLT - 根据长度很好地将长地址拆分为多个标签

Posted

技术标签:

【中文标题】XSLT - 根据长度很好地将长地址拆分为多个标签【英文标题】:XLST - Split Long address into multiple tag based on length nicely 【发布时间】:2020-02-20 17:05:52 【问题描述】:

我有一个 XML 样式表转换,它需要将长文本拆分为多个标签。 它需要根据最大长度 10 很好地分割,当下一个字符无法放入当前行时它将停止。

对此有何建议?

例如:

之前:

<main>
   <header>
      <addresses>aaaaaaa bbbb cccc e ffffffff ggggg hhhh</addresses>
   </header>
</main>

之后:

<main>
   <header>
      <address>aaaaaaa</address>
      <address>bbbb cccc</address>
      <address>e ffffffff</address>
      <address>ggggg hhhh</address>
   </header>
</main>

【问题讨论】:

你已经尝试过什么? “根据最大长度 10 很好地分割”是什么意思?你的输入有三个cs 和两个ds,为什么输出有四个cs 而没有d?您是否查看过 XSLT 3 中的 analyze-string 函数或 XSLT 2 中的 xsl:analyze-string 元素? 嗨,Greenev,我尝试使用标记化,但它只允许分隔符。 嗨 Martin Honen,抱歉让您感到困惑,我已经更新了我的问题。 如果其中一个“单词”长度超过 10 个字符,应该怎么办? (即“zzzzzzzzzzzz”)。 【参考方案1】:

你可以试试这个

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    <xsl:output method="xml" omit-xml-declaration="no"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="addresses">
    <xsl:call-template name="splitSequence">
        <xsl:with-param name="input" select="."/>
    </xsl:call-template>
    </xsl:template>

    <xsl:template name="splitSequence">
        <xsl:param name="input" />
        <addresses><xsl:value-of select="substring($input,1,10)" /></addresses>
        <xsl:if test="substring($input,10+1)">
            <xsl:call-template name="splitSequence">
                <xsl:with-param name="input" select="substring($input,10+1)" />
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

输出是

<main>
<header>
    <addresses>aaaaaaa bb</addresses>
    <addresses>bb cccc e </addresses>
    <addresses>ffffffff g</addresses>
    <addresses>gggg hhhh</addresses>
</header>

【讨论】:

是吗? “漂亮”的部分在哪里? @michael.hor257k 先生,我的搜索文本长度为 10,然后拆分文本。

以上是关于XSLT - 根据长度很好地将长地址拆分为多个标签的主要内容,如果未能解决你的问题,请参考以下文章

使用 xslt 将 xml 复杂节点元素拆分为多个节点

当标签没有值但属性存在时,需要 XSLT 删除标签

如何从 XSLT 中的地址字段中拆分街道和门牌号?

如何在 XSLT 中拆分数据并存储在多个节点中

如何有效地将大型数据框拆分为多个拼花文件?

XSLT - 如何根据分隔符拆分每个元素