如果父节点值匹配,则将相应父节点的所有子节点合并到第一个父节点下

2024-03-13

嗨,我的输入是这样的。

<?xml version="1.0" encoding="UTF-8"?>
         <Claim>
            <Mileage>9837</Mileage>
            <DamagePosition>
               <DamageSeqNumber>3</DamageSeqNumber>
               <DamageCode>2727004</DamageCode>
               <PartPosition>
                  <SeqNumber>1</SeqNumber>
                  <PartNumber>A2035400253</PartNumber>
               </PartPosition>
            </DamagePosition>
            <DamagePosition>
               <DamageSeqNumber>1</DamageSeqNumber>
               <DamageCode>2727004</DamageCode>
               <PartPosition>
                  <SeqNumber>3</SeqNumber>
                  <PartNumber>A1409910055</PartNumber>
               </PartPosition>
            </DamagePosition>
            <DamagePosition>
               <DamageSeqNumber>8</DamageSeqNumber>
               <DamageCode>2727004</DamageCode>
               <OperationPosition>
                  <SeqNumber>8</SeqNumber>
                  <Opcode>02-2710-01</Opcode>
               </OperationPosition>
            </DamagePosition>
            <DamagePosition>
               <DamageSeqNumber>4</DamageSeqNumber>
               <DamageCode>3221136</DamageCode>
               <PartPosition>
                  <SeqNumber>4</SeqNumber>
                  <PartNumber>A2033202889</PartNumber>
               </PartPosition>
            </DamagePosition>
         </Claim>  

期望的输出是:

<?xml version="1.0" encoding="UTF-8"?>
         <Claim>
            <Mileage>9837</Mileage>
            <DamagePosition>
               <DamageSeqNumber>3</DamageSeqNumber>
               <DamageCode>2727004</DamageCode>
               <OperationPosition>
                  <SeqNumber>8</SeqNumber>
                  <Opcode>02-2710-01</Opcode>
               </OperationPosition>
               <PartPosition>
                  <SeqNumber>1</SeqNumber>
                  <PartNumber>A2035400253</PartNumber>
               </PartPosition>
               <PartPosition>
                  <SeqNumber>3</SeqNumber>
                  <PartNumber>A1409910055</PartNumber>
               </PartPosition>
               <OperationPosition>
                  <SeqNumber>8</SeqNumber>
                  <Opcode>02-2710-01</Opcode>
               </OperationPosition>
            </DamagePosition>
            <DamagePosition>
               <DamageSeqNumber>4</DamageSeqNumber>
               <DamageCode>3221136</DamageCode>
               <PartPosition>
                  <SeqNumber>4</SeqNumber>
                  <PartNumber>A2033202889</PartNumber>
               </PartPosition>
            </DamagePosition>
         </Claim>

我尝试了以下 xslt:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:key name="kuserID" match="DamagePosition"  use="DamageCode"/>
 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*">
         <xsl:sort select="DamageCode" data-type="number"/>
       </xsl:apply-templates>
     </xsl:copy>
 </xsl:template>
 <xsl:template match=
 "DamagePosition|DamageCode
 |PartPosition"/>
 <xsl:template match=
  "DamagePosition
    [generate-id()
    =
     generate-id(key('kuserID', DamageCode)[1])
     ]">
  <DamagePosition>
   <xsl:copy-of select="DamageCode"/>
   <xsl:apply-templates mode="copy" select="key('kuserID',DamageCode)" />
  </DamagePosition>
 </xsl:template>
 <xsl:template match="DamagePosition" mode="copy">
  <PartPosition>
   <xsl:apply-templates/>
  </PartPosition>
 </xsl:template>
</xsl:stylesheet>

它给我的输出如下所示,虽然它能够对具有相同 DamageCode 的子元素进行分组,但没有给出所需的输出,但它不会复制零件位置下的所有标签,只有 seqNumber 在输出中可见。也非常感谢任何帮助。感谢您的所有帮助。

<Claim>
   <Mileage>9837</Mileage>
   <DamagePosition>
      <DamageCode>2727004</DamageCode>
      <PartPosition>
         <DamageSeqNumber>3</DamageSeqNumber>
      </PartPosition>
      <PartPosition>
         <DamageSeqNumber>1</DamageSeqNumber>
      </PartPosition>
      <PartPosition>
         <DamageSeqNumber>8</DamageSeqNumber>
         <OperationPosition>
            <SeqNumber>8</SeqNumber>
            <Opcode>02-2710-01</Opcode>
         </OperationPosition>
      </PartPosition>
   </DamagePosition>
   <DamagePosition>
      <DamageCode>3221136</DamageCode>
      <PartPosition>
         <DamageSeqNumber>4</DamageSeqNumber>
      </PartPosition>
   </DamagePosition>
</Claim>

您的 XSLT 中有一个模板忽略PartPosition

<xsl:template match="DamagePosition|DamageCode|PartPosition"/>

因此,当你这样做时<xsl:apply-templates/>在你的copy模板,因为您位于DamagePosition此时,上面的模板将匹配子项PartPosition并忽略它。

也许你应该忽略DamageSeqNumber代替PartPosition在此刻?

另外,您可能并不真正需要copy根本没有模板。相反,更改对它的调用,以简单地获取键的所有子元素,然后让身份模板处理它。

<xsl:apply-templates select="key('kuserID',DamageCode)/*" />

试试这个 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:key name="kuserID" match="DamagePosition"  use="DamageCode"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*">
         <xsl:sort select="DamageCode" data-type="number"/>
       </xsl:apply-templates>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="DamagePosition|DamageCode|DamageSeqNumber"/>

 <xsl:template match="DamagePosition[generate-id() = generate-id(key('kuserID', DamageCode)[1])]">
  <DamagePosition>
   <xsl:copy-of select="DamageCode"/>
   <xsl:copy-of select="DamageSeqNumber"/>
   <xsl:apply-templates select="key('kuserID',DamageCode)/*" />
  </DamagePosition>
 </xsl:template>
</xsl:stylesheet>

这并不能完全给出您在问题中显示的输出,因为您显示了两个OperationPosition输出中包含元素,尽管输入中只有一个元素。

编辑:如果你想要OperationPosition之前的元素PartPosition元素,您可以替换现有的<xsl:apply-templates select="key('kuserID',DamageCode)/*" />用这两行代替:

<xsl:apply-templates select="key('kuserID',DamageCode)/OperationPosition" />
<xsl:apply-templates select="key('kuserID',DamageCode)/*[not(self::OperationPosition)]" />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果父节点值匹配,则将相应父节点的所有子节点合并到第一个父节点下 的相关文章

随机推荐