【问题标题】:XSL Duplicate Merge and convert attributes to tagsXSL 复制合并并将属性转换为标签
【发布时间】: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。如果您不能将此应用于您的情况,请发布您的最佳尝试。 -- 提示:按照&lt;xsl:key name="elem-by-name" match="*[@*]" use="name()" /&gt; 定义您的密钥。

标签: xml xslt xml-parsing xslt-1.0


【解决方案1】:

你的问题不清楚。也许你可以这样做:

XSLT 1.0

<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:template match="/data">
    <xsl:copy>
        <c67>
            <xsl:for-each select="c67">
                <xsl:element name="m{@m}">
                    <xsl:value-of select="." />
                </xsl:element>
            </xsl:for-each>
        </c67>
        <xsl:copy-of select="*[not(self::c67)]"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

鉴于您的输入示例,这将返回:

结果

<?xml version="1.0" encoding="UTF-8"?>
<data>
  <c67>
    <m103>101</m103>
    <m104>DELEUNIQUEID12311150</m104>
    <m105>002500-404</m105>
    <m107>0505-095916</m107>
    <m108>0505</m108>
    <m203>DELEUNIQUEID1112354121</m203>
    <m205>0000030</m205>
    <m284>1204896941</m284>
    <m303>0000030</m303>
  </c67>
  <c57 m="01">0000020</c57>
  <c57 m="02">NO</c57>
  <c62>NO</c62>
  <c63>TR</c63>
</data>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2011-05-26
    • 2015-03-15
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2014-11-11
    相关资源
    最近更新 更多