【发布时间】:2021-08-13 16:47:08
【问题描述】:
我有一个如下所示的 xml。标签 c67 和标签 c57 具有不同的属性。如果标签是多值,就会发生这种情况。
<data>
<c67 m="103">101</c67>
<c67 m="104">DELEUNIQUEID12311150</c67>
<c67 m="105">002500-404</c67>
<c67 m="107">0505-095916</c67>
<c67 m="108">0505</c67>
<c67 m="203">DELEUNIQUEID1112354121</c67>
<c67 m="205">0000030</c67>
<c67 m="284">1204896941</c67>
<c67 m="303">0000030</c67>
<c57 m="01">0000020</c57>
<c57 m="02">NO</c57>
<c62>NO</c62>
<c63>TR</c63>
</data>
我需要将所有重复标签转换为一个带有子对象的对象,如下所示。标签将始终具有属性。如果我有标签 c67 出现多个。将使用标签 c67 创建一个对象,并且所有重复标签都是该标签的子标签。如下所示。见标签 c67 和 c57 。标签是动态的,不是静态的。在这种情况下,产生了 c67 和 c57。在另一个实例上,它可以是 c47 或 C31 或任何其他。我正在寻找动态解决方案,每当我有重复的带有属性的标签时,总是生成如下所示的 xml
<data>
<c67>
<m103>101</m103>
<m67>DELEUNIQUEID12311150</m67>
<m105>002500-404</m105>
<m205>0000030</m205>
</c67>
<c57>
<m02>0000020 </m02>
<m01>NO</m01>
</c57>
<c62>NO</c62>
<c63>TR</c63>
</data>
我有下面的 xslt,它非常接近,但会生成数组
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes" encoding="UTF-8" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="*" mode="m"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*">
<xsl:element name="m{.}"><xsl:value-of select="../node()" /></xsl:element>
</xsl:template>
<xsl:template match="*" mode="m">
<xsl:choose>
<xsl:when test="not(@*)">
<xsl:element name="{local-name()}"><xsl:value-of select="."/></xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*" /></xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
生成如下所示的内容。
<data>
<c67>
<m9>DELEUNIQUEID1231151</m9>
</c67>
<c67>
<m94>QWEWEQWQWE</m94>
</c67>
<c67>
<m95>111</m95>
</c67>
<c67>
<m101>0200830000</m101>
</c67>
<c67>
<m102>404</m102>
</c67>
<c57>
<m01>0000020 </m01>
</c57>
<c57>
<m02>No</m02>
</c57>
</data>
如何使用 xslt 实现上述结果
【问题讨论】:
-
您的业务规则不明确。为什么有些值没有被使用?
-
这只是预期的一个例子。这就是为什么有些值被遗漏了
-
好吧,这个例子有误导性,不清楚你想在这里完成什么。
-
我已经编辑了问题以使问题更加清晰
-
这已成为一个分组问题。 XSLT 1.0 中的首选分组方法如下所述:jenitennison.com/xslt/grouping/muenchian.html。如果您不能将此应用于您的情况,请发布您的最佳尝试。 -- 提示:按照
<xsl:key name="elem-by-name" match="*[@*]" use="name()" />定义您的密钥。
标签: xml xslt xml-parsing xslt-1.0