gpt4 book ai didi

xslt - 使用 XSLT 1.0 拆分 XML 中的值

转载 作者:行者123 更新时间:2023-12-03 15:50:01 24 4
gpt4 key购买 nike

我真的是这个 XSLT 世界的新手。我面临着拆分单个 XML 节点中存在的值的问题。

例如,我的输入 XML 包含以下数据:

<Employee>
<FirstName>AAA</FirstName>
<LastName>BBB</LastName>
<MobileNo>9999999999-6666666666-7777777777</MobileNo>
</Employee>

在上面的示例中,一名员工可以拥有多个手机号码,因此他的所有手机号码都合并到一个 XML 节点中 <MobileNo> .连字符 (-) 用于分隔手机号码,表示 9999999999是第一个手机号码,6666666666是第二个手机号码,7777777777是第三个手机号码。一名员工可以拥有任意数量的手机号码。

Myy 输出 XML 应具有以下结构。

<Employee>
<FirstName>AAA</FirstName>
<LastName>BBB</LastName>
<MobileNo>9999999999</MobileNo>
<MobileNo>6666666666</MobileNo>
<MobileNo>7777777777</MobileNo>
</Employee>

那么我如何使用 XSLT 1.0 实现这一目标呢?

我们将不胜感激。

最佳答案

这是一个完整的,更短更简单的(没有xsl:choose,没有xsl:when,没有xsl:otherwise ) XSLT 1.0 转换“拆分”任意数量的破折号分隔字符串:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<xsl:template match="MobileNo" name="split">
<xsl:param name="pText" select="."/>

<xsl:if test="$pText">
<MobileNo>
<xsl:value-of select="substring-before(concat($pText, '-'), '-')"/>
</MobileNo>

<xsl:call-template name="split">
<xsl:with-param name="pText" select="substring-after($pText, '-')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<Employee>
<FirstName>AAA</FirstName>
<LastName>BBB</LastName>
<MobileNo>9999999999-6666666666-7777777777</MobileNo>
</Employee>

产生了想要的、正确的结果:

<Employee>
<FirstName>AAA</FirstName>
<LastName>BBB</LastName>
<MobileNo>9999999999</MobileNo>
<MobileNo>6666666666</MobileNo>
<MobileNo>7777777777</MobileNo>
</Employee>

解释:

  1. 递归调用命名模板(split)。

  2. 停止条件是传递的参数为空节点集/字符串。

  3. 使用哨兵来避免不必要的条件指令。

关于xslt - 使用 XSLT 1.0 拆分 XML 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10861029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com