Удалить поле пустых элементов и значение по умолчанию в сообщении XML с помощью XSLT - PullRequest
0 голосов
/ 02 января 2012

Подробная спецификация требования: в сообщении-запросе есть поле с именем IgnoreEmptyElement, и оно имеет логический тип. Если это поле True, необходимо игнорировать пустые поля элемента в сообщении запроса и значения по умолчанию, такие как "-111", должны быть установлены в качестве найденного значения по умолчанию. В случае false нет необходимости удалять пустые элементы, только если найдены значения по умолчанию, об этом должно быть сообщено.

Мое входящее сообщение:

<SampleUpdRq>
     <RqUID>00000000-0000-0000-0000-000000000000</RqUID>
     <UpdMsgRqHdr>
          <ContextRqHdr>
              <RsSelURL>111</RsSelURL>
              <NetworkTrnData>
                    <TerminalIdent>a</TerminalIdent>
                    <Name>111</Name>
              </NetworkTrnData>
              <ClientApp>
                     <Org>dweer</Org>
                     <Name>aaaaaaaaaaaaaaaaaaa</Name>
                     <Version>112</Version>
                     <Channel>abc</Channel>
              </ClientApp>
          </ContextRqHdr>
          <IgnoreEmptyElementInd>true</IgnoreEmptyElementInd>
     </UpdMsgRqHdr>
     <SampleKeys>
           <SampleId>aaaaaaaaaaaaaaaaaaa</SampleId>
           <AltSampleIdentifiers>
              <SampleIdent>
                   <SampleIdentType>-111</SampleIdentType>
                    <SampleIdentValue>ttttttt</SampleIdentValue>
              </SampleIdent>
              <SampleIdentType/>
           </AltSampleIdentifiers>
           <SampleType>
                <SampleTypeValue>MMA</SampleTypeValue>
                <SampleTypeSrc>bbc</SampleTypeSrc>
                <CommercialSampleType></CommercialSampleType>
           </SampleType>
           <CommercialSampleType>-111</CommercialSampleType>
           <COID>aaaaa</COID>
       </SampleKeys>
</SampleUpdRq> 

Если значение IgnoreEmptyElementInd равно true , то вывод shd будет похож на

<SampleUpdRq>
     <RqUID>00000000-0000-0000-0000-000000000000</RqUID>
     <UpdMsgRqHdr>
          <ContextRqHdr>
              <RsSelURL>111</RsSelURL>
              <NetworkTrnData>
                    <TerminalIdent>a</TerminalIdent>
                    <Name>111</Name>
              </NetworkTrnData>
              <ClientApp>
                     <Org>dweer</Org>
                     <Name>aaaaaaaaaaaaaaaaaaa</Name>
                     <Version>112</Version>
                     <Channel>abc</Channel>
              </ClientApp>
          </ContextRqHdr>
          <IgnoreEmptyElementInd>true</IgnoreEmptyElementInd>
     </UpdMsgRqHdr>
     <SampleKeys>
           <SampleId>aaaaaaaaaaaaaaaaaaa</SampleId>
           <AltSampleIdentifiers>
              <SampleIdent>
                   <SampleIdentType>Default Found</SampleIdentType>
                    <SampleIdentValue>ttttttt</SampleIdentValue>
              </SampleIdent>
           </AltSampleIdentifiers>
           <SampleType>
                <SampleTypeValue>MMA</SampleTypeValue>
                <SampleTypeSrc>bbc</SampleTypeSrc>
           </SampleType>
           <CommercialSampleType>Default Found</CommercialSampleType>
           <COID>aaaaa</COID>
       </SampleKeys>
</SampleUpdRq>

Если значение IgnoreEmptyElementInd равно false , то вывод shd будет похож на

<SampleUpdRq>
     <RqUID>00000000-0000-0000-0000-000000000000</RqUID>
     <UpdMsgRqHdr>
          <ContextRqHdr>
              <RsSelURL>111</RsSelURL>
              <NetworkTrnData>
                    <TerminalIdent>a</TerminalIdent>
                    <Name>111</Name>
              </NetworkTrnData>
              <ClientApp>
                     <Org>dweer</Org>
                     <Name>aaaaaaaaaaaaaaaaaaa</Name>
                     <Version>112</Version>
                     <Channel>abc</Channel>
              </ClientApp>
          </ContextRqHdr>
          <IgnoreEmptyElementInd>false</IgnoreEmptyElementInd>
     </UpdMsgRqHdr>
     <SampleKeys>
           <SampleId>aaaaaaaaaaaaaaaaaaa</SampleId>
           <AltSampleIdentifiers>
              <SampleIdent>
                   <SampleIdentType>Default Found</SampleIdentType>
                    <SampleIdentValue>ttttttt</SampleIdentValue>
              </SampleIdent>
              <SampleIdentType/>
           </AltSampleIdentifiers>
           <SampleType>
                <SampleTypeValue>MMA</SampleTypeValue>
                <SampleTypeSrc>bbc</SampleTypeSrc>
            <CommercialSampleType/>
           </SampleType>
           <CommercialSampleType>Default Found</CommercialSampleType>
           <COID>aaaaa</COID>
       </SampleKeys>
</SampleUpdRq>

Я написал XSL так:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>     

<xsl:template match="*[not(node())]" />     

<xsl:template match="*[. = '-111']">       
  <xsl:copy>          
    <xsl:text>Default Found</xsl:text>
 </xsl:copy>    
</xsl:template>     

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

</xsl:stylesheet> 

Очень ценю опытную помощь и извиняюсь за путаницу. Заранее спасибо.

1 Ответ

1 голос
/ 03 января 2012

В одном из ваших комментариев вы говорите: «элементы, следующие после IgnoreEmptyElementInd, правило должно применяться», и в этом случае кажется, что вам нужно использовать «предыдущую» ось в XPath для определения значения.

Таким образом, вы можете расширить свой XSLT с помощью этого шаблона, чтобы игнорировать пустые узлы, когда IgnoreEmptyElementInd установлено в значение true.

<xsl:template 
   match="*[not(node())][preceding::IgnoreEmptyElementInd[. = 'true']]"/>

Итак, учитывая следующее XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="*[not(node())][preceding::IgnoreEmptyElementInd[. = 'true']]"/>

   <xsl:template match="*[. = '-111']">
      <xsl:copy>
         <xsl:text>Default Found</xsl:text>
      </xsl:copy>
   </xsl:template>

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

При применении к вашему образцу XML выводится следующее:

<SampleUpdRq>
   <RqUID>00000000-0000-0000-0000-000000000000</RqUID>
   <UpdMsgRqHdr>
      <ContextRqHdr>
         <RsSelURL>111</RsSelURL>
         <NetworkTrnData>
            <TerminalIdent>a</TerminalIdent>
            <Name>111</Name>
         </NetworkTrnData>
         <ClientApp>
            <Org>dweer</Org>
            <Name>aaaaaaaaaaaaaaaaaaa</Name>
            <Version>112</Version>
            <Channel>abc</Channel>
         </ClientApp>
      </ContextRqHdr>
      <IgnoreEmptyElementInd>true</IgnoreEmptyElementInd>
   </UpdMsgRqHdr>
   <SampleKeys>
      <SampleId>aaaaaaaaaaaaaaaaaaa</SampleId>
      <AltSampleIdentifiers>
         <SampleIdent>
            <SampleIdentType>Default Found</SampleIdentType>
            <SampleIdentValue>ttttttt</SampleIdentValue>
         </SampleIdent>
      </AltSampleIdentifiers>
      <SampleType>
         <SampleTypeValue>MMA</SampleTypeValue>
         <SampleTypeSrc>bbc</SampleTypeSrc>
      </SampleType>
      <CommercialSampleType>Default Found</CommercialSampleType>
      <COID>aaaaa</COID>
   </SampleKeys>
</SampleUpdRq>

Когда IgnoreEmptyElementInd имеет значение «ложь», вместо него выводится следующее

<SampleUpdRq>
   <RqUID>00000000-0000-0000-0000-000000000000</RqUID>
   <UpdMsgRqHdr>
      <ContextRqHdr>
         <RsSelURL>111</RsSelURL>
         <NetworkTrnData>
            <TerminalIdent>a</TerminalIdent>
            <Name>111</Name>
         </NetworkTrnData>
         <ClientApp>
            <Org>dweer</Org>
            <Name>aaaaaaaaaaaaaaaaaaa</Name>
            <Version>112</Version>
            <Channel>abc</Channel>
         </ClientApp>
      </ContextRqHdr>
      <IgnoreEmptyElementInd>false</IgnoreEmptyElementInd>
   </UpdMsgRqHdr>
   <SampleKeys>
      <SampleId>aaaaaaaaaaaaaaaaaaa</SampleId>
      <AltSampleIdentifiers>
         <SampleIdent>
            <SampleIdentType>Default Found</SampleIdentType>
            <SampleIdentValue>ttttttt</SampleIdentValue>
         </SampleIdent>
         <SampleIdentType/>
      </AltSampleIdentifiers>
      <SampleType>
         <SampleTypeValue>MMA</SampleTypeValue>
         <SampleTypeSrc>bbc</SampleTypeSrc>
         <CommercialSampleType/>
      </SampleType>
      <CommercialSampleType>Default Found</CommercialSampleType>
      <COID>aaaaa</COID>
   </SampleKeys>
</SampleUpdRq>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...