xslt-2.0 - XSLT - 在复制所有其他元素时向元素添加序列号/计数器
问题描述
亲爱的,我在 xml 下面有一个 edi xml,里面有 2 个文档。我想为 M_810 下的每个 ST 和 SE 分配一个序列号我有 2 个 M_810 用于我的第一个 M_810 - ST-D_329 和 SE-D-329 - 我想有序列号 2001 第二个 M_810 - ST-D_329 和 SE- D_329 - 我想要序列号 2002
我试过下面的代码。它总是在需要的地方给我 2001。寻求一些帮助来解决这个问题。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="D_329">
<xsl:if test="((../name() = 'S_ST') or (../name() = 'S_SE'))">
<D_329><xsl:value-of select="2000 + ../position()"/></D_329>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
源代码:
<?xml version='1.0' encoding='UTF-8'?><Interchange>
<M_810>
<S_ST>
<D_143>810</D_143>
<D_329>47857</D_329>
</S_ST>
<S_BIG>
<D_373>20210128</D_373>
<D_76>917183</D_76>
<D_373_2>20210120</D_373_2>
<D_324>13453796</D_324>
</S_BIG>
<S_SE>
<D_96>21</D_96>
<D_329>47857</D_329>
</S_SE>
</M_810>
<M_810>
<S_ST>
<D_143>810</D_143>
<D_329>47858</D_329>
</S_ST>
<S_BIG>
<D_373>20210128</D_373>
<D_76>917184</D_76>
<D_373_2>20210120</D_373_2>
<D_324>13453797</D_324>
</S_BIG>
<S_SE>
<D_96>21</D_96>
<D_329>47858</D_329>
</S_SE>
</M_810>
</Interchange>
所需输出:
<?xml version="1.0" encoding="UTF-8"?><Interchange>
<M_810>
<S_ST>
<D_143>810</D_143>
<D_329>2001</D_329>
</S_ST>
<S_BIG>
<D_373>20210128</D_373>
<D_76>917183</D_76>
<D_373_2>20210120</D_373_2>
<D_324>13453796</D_324>
</S_BIG>
<S_SE>
<D_96>21</D_96>
<D_329>2001</D_329>
</S_SE>
</M_810>
<M_810>
<S_ST>
<D_143>810</D_143>
<D_329>2002</D_329>
</S_ST>
<S_BIG>
<D_373>20210128</D_373>
<D_76>917184</D_76>
<D_373_2>20210120</D_373_2>
<D_324>13453797</D_324>
</S_BIG>
<S_SE>
<D_96>21</D_96>
<D_329>2002</D_329>
</S_SE>
</M_810>
</Interchange>
父节点中每次出现都要修改的 xml 节点:
<S_ST>
<D_143>810</D_143>
<D_329>47857</D_329> >> <D_329>2001</D_329>
</S_ST>
and
<S_SE>
<D_96>21</D_96>
<D_329>47857</D_329> >> <D_329>2001</D_329>
</S_SE>
解决方案
假设 XSLT 3,听起来好像你想要
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="M_810/S_ST/D_329">
<xsl:copy>
<xsl:number count="M_810/S_ST/D_329" start-at="2001" level="any"/>
</xsl:copy>
</xsl:template>
<xsl:template match="M_810/S_SE/D_329">
<xsl:copy>
<xsl:number count="M_810/S_SE/D_329" start-at="2001" level="any"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我还不能检查正确的输出,检查自己,或者如果它不起作用,请考虑从样本中删除不相关的元素,以简化我们查看要转换和编号的元素的任务。
推荐阅读
- javascript - B样条几何
- python - Pygame中的Bloom效果,使文本发光
- java - LocalBroadcastManager 替代品?
- javascript - 'Date | 类型的参数 null' 不能分配给“字符串”类型的参数
- python - Python中的变异函数模型估计问题
- css - React Modal - 如何在下拉菜单中显示在 Modal 中单击的单选按钮值?
- javascript - 反应 useCallback - 我无法更新我的功能
- node.js - 尝试运行 React App 时出现预期的标识符错误
- html - 如何使动态可折叠菜单可访问?
- html - 如果标题在 html 中有背景颜色,为什么标题会变得透明?