1

我在组合 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>
4

1 回答 1

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. 孟加群。

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

  3. 钥匙的使用。

于 2012-10-15T19:44:17.483 回答