XSLT - 在复制所有其他元素的同时向元素添加序列 number/counter
XSLT - Adding a sequence number/counter to an element while copying all other elements
亲爱的,
我在 xml 下面有一个 edi xml,里面有 2 个文档。我想为 M_810 下的每个 ST 和 SE 分配一个序列号
我的第一个 M_810 - ST-D_329 和 SE-D-329 有 2 M_810 - 我想要序列号 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:
<?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>
我还不能完全检查正确的输出,检查你自己或者如果它不起作用考虑从示例中删除不相关的元素以简化我们的任务来查看你想要转换和编号的元素。
亲爱的, 我在 xml 下面有一个 edi xml,里面有 2 个文档。我想为 M_810 下的每个 ST 和 SE 分配一个序列号 我的第一个 M_810 - ST-D_329 和 SE-D-329 有 2 M_810 - 我想要序列号 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:
<?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>
我还不能完全检查正确的输出,检查你自己或者如果它不起作用考虑从示例中删除不相关的元素以简化我们的任务来查看你想要转换和编号的元素。