如何使用XSLT将XML元素与相同的id组合在一起

时间:2012-10-15 18:57:44

标签: xslt

我在组合XML元素时遇到了问题。以下xml具有重复值(T804),如何使用XSLT将它们组合到记录中的一个T804记录中。

在:

<OBR>
<OBR_31_Lab_Ins_Typ_Id>IL</OBR_31_Lab_Ins_Typ_Id>
<OBX>
<OBX_3_Ltt_Cd>T084</OBX_3_Ltt_Cd>
<OBX_5_1_Lbr_No></OBX_5_1_Lbr_No>
<OBX_5_2_Lbr_Tx>HIGH</OBX_5_2_Lbr_Tx>
<OBX_6_Lbr_Unt_Tx></OBX_6_Lbr_Unt_Tx>
<OBX_7_Lbr_Rng_Tx>1.003-1.035</OBX_7_Lbr_Rng_Tx>
</OBX>
<OBX>
<OBX_3_Ltt_Cd>T084</OBX_3_Ltt_Cd>
<OBX_5_1_Lbr_No>1.038</OBX_5_1_Lbr_No>
<OBX_5_2_Lbr_Tx></OBX_5_2_Lbr_Tx>
<OBX_6_Lbr_Unt_Tx></OBX_6_Lbr_Unt_Tx>
<OBX_7_Lbr_Rng_Tx>1.003-1.035</OBX_7_Lbr_Rng_Tx>
</OBX>
<OBX>
<OBX_3_Ltt_Cd>T086</OBX_3_Ltt_Cd>
<OBX_5_1_Lbr_No>0</OBX_5_1_Lbr_No>
<OBX_5_2_Lbr_Tx></OBX_5_2_Lbr_Tx>
<OBX_6_Lbr_Unt_Tx>HPF</OBX_6_Lbr_Unt_Tx>
<OBX_7_Lbr_Rng_Tx>0-9</OBX_7_Lbr_Rng_Tx>
</OBX>
<OBX>
<OBX_3_Ltt_Cd>T087</OBX_3_Ltt_Cd>
<OBX_5_1_Lbr_No>0</OBX_5_1_Lbr_No>
<OBX_5_2_Lbr_Tx></OBX_5_2_Lbr_Tx>
<OBX_6_Lbr_Unt_Tx>HPF</OBX_6_Lbr_Unt_Tx>
<OBX_7_Lbr_Rng_Tx>0-4</OBX_7_Lbr_Rng_Tx>
</OBX>
</ORB>

之后 - 将两个T084记录合并为一个。

<OBR>
<OBR_31_Lab_Ins_Typ_Id>IL</OBR_31_Lab_Ins_Typ_Id>
<OBX>
<OBX_3_Ltt_Cd>T084</OBX_3_Ltt_Cd>
<OBX_5_1_Lbr_No>1.038</OBX_5_1_Lbr_No>
<OBX_5_2_Lbr_Tx>HIGH</OBX_5_2_Lbr_Tx>
<OBX_6_Lbr_Unt_Tx></OBX_6_Lbr_Unt_Tx>
<OBX_7_Lbr_Rng_Tx>1.003-1.035</OBX_7_Lbr_Rng_Tx>
<OBX>
<OBX_3_Ltt_Cd>T086</OBX_3_Ltt_Cd>
<OBX_5_1_Lbr_No>0</OBX_5_1_Lbr_No>
<OBX_5_2_Lbr_Tx></OBX_5_2_Lbr_Tx>
<OBX_6_Lbr_Unt_Tx>HPF</OBX_6_Lbr_Unt_Tx>
<OBX_7_Lbr_Rng_Tx>0-9</OBX_7_Lbr_Rng_Tx>
</OBX>
<OBX>
<OBX_3_Ltt_Cd>T087</OBX_3_Ltt_Cd>
<OBX_5_1_Lbr_No>0</OBX_5_1_Lbr_No>
<OBX_5_2_Lbr_Tx></OBX_5_2_Lbr_Tx>
<OBX_6_Lbr_Unt_Tx>HPF</OBX_6_Lbr_Unt_Tx>
<OBX_7_Lbr_Rng_Tx>0-4</OBX_7_Lbr_Rng_Tx>
</OBX>
</ORB>

1 个答案:

答案 0 :(得分:2)

此转化

<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="kOrderByCd" match="OBX"
  use="OBX_3_Ltt_Cd"/>

 <xsl:template match="node()|@*" name="identity">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
  "OBX[generate-id()
      =
       generate-id(key('kOrderByCd', OBX_3_Ltt_Cd)[1])
      and
       key('kOrderByCd', OBX_3_Ltt_Cd)[2]
       ]">
  <OBX>
    <xsl:apply-templates mode="inGroup"/>
  </OBX>
 </xsl:template>

  <xsl:template match=
  "OBX[not(generate-id()
          =
           generate-id(key('kOrderByCd', OBX_3_Ltt_Cd)[1])
           )
       ]"/>

 <xsl:template match="OBX/*" mode="inGroup">
  <xsl:variable name="vNonEmpty" select=
   "key('kOrderByCd', ../OBX_3_Ltt_Cd)
            /*[name() = name(current())
             and
               text()
              ]"/>
  <xsl:apply-templates select=
    "$vNonEmpty[1]| self::*[not($vNonEmpty)]"/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<OBR>
    <OBR_31_Lab_Ins_Typ_Id>IL</OBR_31_Lab_Ins_Typ_Id>
    <OBX>
        <OBX_3_Ltt_Cd>T084</OBX_3_Ltt_Cd>
        <OBX_5_1_Lbr_No></OBX_5_1_Lbr_No>
        <OBX_5_2_Lbr_Tx>HIGH</OBX_5_2_Lbr_Tx>
        <OBX_6_Lbr_Unt_Tx></OBX_6_Lbr_Unt_Tx>
        <OBX_7_Lbr_Rng_Tx>1.003-1.035</OBX_7_Lbr_Rng_Tx>
    </OBX>
    <OBX>
        <OBX_3_Ltt_Cd>T084</OBX_3_Ltt_Cd>
        <OBX_5_1_Lbr_No>1.038</OBX_5_1_Lbr_No>
        <OBX_5_2_Lbr_Tx></OBX_5_2_Lbr_Tx>
        <OBX_6_Lbr_Unt_Tx></OBX_6_Lbr_Unt_Tx>
        <OBX_7_Lbr_Rng_Tx>1.003-1.035</OBX_7_Lbr_Rng_Tx>
    </OBX>
    <OBX>
        <OBX_3_Ltt_Cd>T086</OBX_3_Ltt_Cd>
        <OBX_5_1_Lbr_No>0</OBX_5_1_Lbr_No>
        <OBX_5_2_Lbr_Tx></OBX_5_2_Lbr_Tx>
        <OBX_6_Lbr_Unt_Tx>HPF</OBX_6_Lbr_Unt_Tx>
        <OBX_7_Lbr_Rng_Tx>0-9</OBX_7_Lbr_Rng_Tx>
    </OBX>
    <OBX>
        <OBX_3_Ltt_Cd>T087</OBX_3_Ltt_Cd>
        <OBX_5_1_Lbr_No>0</OBX_5_1_Lbr_No>
        <OBX_5_2_Lbr_Tx></OBX_5_2_Lbr_Tx>
        <OBX_6_Lbr_Unt_Tx>HPF</OBX_6_Lbr_Unt_Tx>
        <OBX_7_Lbr_Rng_Tx>0-4</OBX_7_Lbr_Rng_Tx>
    </OBX>
</OBR>

会产生想要的正确结果:

<OBR>
   <OBR_31_Lab_Ins_Typ_Id>IL</OBR_31_Lab_Ins_Typ_Id>
   <OBX>
      <OBX_3_Ltt_Cd>T084</OBX_3_Ltt_Cd>
      <OBX_5_1_Lbr_No>1.038</OBX_5_1_Lbr_No>
      <OBX_5_2_Lbr_Tx>HIGH</OBX_5_2_Lbr_Tx>
      <OBX_6_Lbr_Unt_Tx/>
      <OBX_7_Lbr_Rng_Tx>1.003-1.035</OBX_7_Lbr_Rng_Tx>
   </OBX>
   <OBX>
      <OBX_3_Ltt_Cd>T086</OBX_3_Ltt_Cd>
      <OBX_5_1_Lbr_No>0</OBX_5_1_Lbr_No>
      <OBX_5_2_Lbr_Tx/>
      <OBX_6_Lbr_Unt_Tx>HPF</OBX_6_Lbr_Unt_Tx>
      <OBX_7_Lbr_Rng_Tx>0-9</OBX_7_Lbr_Rng_Tx>
   </OBX>
   <OBX>
      <OBX_3_Ltt_Cd>T087</OBX_3_Ltt_Cd>
      <OBX_5_1_Lbr_No>0</OBX_5_1_Lbr_No>
      <OBX_5_2_Lbr_Tx/>
      <OBX_6_Lbr_Unt_Tx>HPF</OBX_6_Lbr_Unt_Tx>
      <OBX_7_Lbr_Rng_Tx>0-4</OBX_7_Lbr_Rng_Tx>
   </OBX>
</OBR>

<强>解释

  1. Muenchian分组。

  2. 使用和覆盖身份规则。

  3. 使用密钥。