xml - 如何使用 xslt 1.0 在 xml 元素中划分字符串
问题描述
我面临划分付款历史字符串的问题,例如
"Apr:2013,XXX/STD|Jan:2013,XXX/STD|Dec:2012,XXX/STD|Nov:2012,XXX/STD|"
到下面的xml元素如下
<Periods>
<Period Year=2013>
<Months month1="Apr" month1Value="XXX/STD" month2="Jan" month2Value="XXX/STD"
</Period >
<Period Year=2012>
<Months month1="Dec" month1Value="XXX/STD" month2="Nov" month2Value="XXX/STD"
</Period>
</Periods>
来自评论
让我们假设我的确切付款历史如下“Apr:2013,XXX/STD|Mar:2013,XXX/STD|Feb:2013,XXX/STD|Jan:2013,XXX/STD|Dec:2012,XXX/STD|Nov :2012,XXX/STD|Oct:2012,XXX/STD|Sep:2012,XXX/STD|Aug:2012,XXX/STD|Jul:2012,XXX/STD|Jun:2012,XXX/STD|May:2012 ,XXX/STD|Apr:2012,XXX/STD|Mar:2012,XXX/STD|" 但现在它生成重复节点。请建议
解决方案
假设您的字符串将包含按year分类的付款历史记录。
下面的代码做了什么:
1.它将每隔一个分隔符'|'分割字符串
例如它将生成
<temp>Apr:2013,XXX/STD|Jan:2013,XXX/STD</temp>
<temp>Dec:2012,XXX/STD|Nov:2012,XXX/STD</temp>
2.此外,它将从<temp>
存储在变量中的生成数组的每次迭代中获取值values
。
干得好:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common" version="1.0"
exclude-result-prefixes="exsl">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="payment_history">
<xsl:variable name="values">
<xsl:call-template name="split">
<xsl:with-param name="pText" select="."/>
</xsl:call-template>
</xsl:variable>
<Periods>
<xsl:for-each select="exsl:node-set($values)/*">
<Period Year="{substring-before(substring-after(normalize-space(.),':'),',')}">
<Months month1="{substring-before(.,':')}"
month1Value="{substring-before(substring-after(normalize-space(.),','),'|')}"
month2="{substring-before(substring-after(normalize-space(.),'|'),':')}"
month2Value="{substring-after(substring-after(normalize-space(.),'|'),',')}" />
</Period>
</xsl:for-each>
</Periods>
</xsl:template>
<xsl:template match="text()" name="split">
<xsl:param name="pText" select="."/>
<xsl:if test="normalize-space($pText)">
<xsl:variable name="vText" select="normalize-space($pText)"/>
<temp>
<xsl:value-of select="substring-before($vText, '|')"/>
<xsl:value-of select="concat('|', substring-before(substring-after($vText, '|'), '|'))"/>
</temp>
<xsl:call-template name="split">
<xsl:with-param name="pText" select="substring-after(substring-after($vText, '|'), '|')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- sql - 如何在 SQL 中将具有成对关系的行合并为单行
- python-3.x - 计算多个城市的中心点纬度/经度
- javascript - 如何使用 eventListener 通过 Node 和 Express 发送发布请求?
- python - QTreeView 只装饰和缩进某些列
- javascript - 如何在 TypeScript 中安全地键入分层元数据对象?
- vuex - 更新过滤的多行 Vuex 支持的表单会导致“不改变 vuex 存储状态”
- php - csv 文件的每一行都有州、县和数据。如何使用 PHP 关联数组转换为 states=>counties=>county=>data
- python - 如何找到第一次调用函数的位置并相应地返回 None ?
- css - 使用 VS2019 的 Bootstrap 4.5.0 CSS 4.0 编译错误
- c - 在 C 中使用多个关系运算符的问题