You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT 2.0如何提取XML冒号分隔文本生成对应结构化节点

XSLT 2.0 实现方案

不需要用通配符做匹配,XSLT 2.0 原生的字符串处理函数完全可以实现这个需求,核心思路是拆分<body>内的多行文本,逐行动态生成对应节点即可。

完整转换代码

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 身份模板:原样保留无需特殊处理的节点和属性 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- 单独处理body节点 -->
  <xsl:template match="body">
    <!-- 按换行拆分文本,去除每行前后空白,过滤空行 -->
    <xsl:variable name="validLines" select="tokenize(., '\n') ! normalize-space(.)[. != '']"/>
    <xsl:for-each select="$validLines">
      <!-- 拆分节点名和节点值:第一个冒号前为节点名,剩余内容为值 -->
      <xsl:variable name="nodeName" select="substring-before(., ':')"/>
      <xsl:variable name="nodeValue" select="normalize-space(substring-after(., ':'))"/>
      <!-- 动态生成目标节点 -->
      <xsl:element name="{$nodeName}">
        <xsl:value-of select="$nodeValue"/>
      </xsl:element>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

逻辑说明

  • 身份模板会自动保留根节点<mail>这类不需要修改的结构,只会替换<body>节点下的内容,不会破坏原有XML的外层结构
  • 拆分文本时优先按换行符切割,自动过滤掉缩进、空行带来的无效内容,兼容不同操作系统的换行符差异
  • 节点名和值的拆分以每行第一个冒号为分隔符,即使后续取值里包含冒号也不会出现拆分错误
  • 所有取值都会自动做首尾空白去除,避免保留原文本里冒号后的空格、换行等多余字符

转换效果

传入提供的示例XML,转换后输出结果完全符合预期:

<mail>
   <Fruit>apple</Fruit>
   <Vagetable>potato</Vagetable>
   <Animal>dog</Animal>
</mail>

内容的提问来源于stack exchange,提问作者Anonymus007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:33:31