2012-01-02 61 views
0

需求的详细规范是,在请求消息中有一个名称为IgnoreEmptyElementInd的字段,它是布尔类型的。如果该字段为True,则需要忽略请求消息中的空元素字段,并将缺省值(如“-111”shd)设置为找到的默认值。在假的情况下,只有在找到默认值时才需要删除空元素,否则会通知它。使用XSLT删除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>-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的值为,然后输出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的值是,然后输出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

您的第一个XSLT示例具有'version =“2.0”',您是否使用XSLT 2.0处理器?并考虑发布一个代表性的XML输入示例以及您想要创建的相应结果,然后我们可以推荐正确的XSLT解决方案。 – 2012-01-02 17:58:28

+0

您需要定义用于删除元素的条件。请编辑问题并添加。 – 2012-01-02 18:18:33

+0

@Vinay:** ** IgnoreEmptyElementInd **适用于整个XML文档,还是仅适用于** UpdMsgRqHdr **元素? – 2012-01-04 08:48:50

回答

1

在您的一条评论中,您说“IgnoreEmptyElementInd后面的元素应该应用”,在这种情况下,您需要使用XPath中的“之前”轴来确定值。

因此,当IgnoreEmptyElementInd设置为true时,可以使用此模板扩展您的XSLT以忽略空节点。

<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> 
+0

感谢您的回复@Tim C.我还有1个疑问,在上面的XML msg deris字段中名为IgnoreEmptyElementInd dis是布尔类型。 如果值为真IgnoreEmptyElementInd =>需要删除消息中的所有空元素字段 =>对于日期类型字段和“-111”,会有少量defalut值,例如“1200-1-1”整数类型字段,对于具有这些值的元素,只保留元素字段shd。 如果该值为假 =>无需删除消息中的空元素字段 =>需要删除具有上述缺省值的元素。是否可以在XSL中使用? – Vinay 2012-01-03 17:03:22

+0

您或者需要修改完整和详细的要求的原始问题,所以没有误解。如果您给出了“IgnoreEmptyElementInd”的完整规则,那么应该可以做到。 – 2012-01-04 07:23:42

+0

用详细的要求更改了原始问题。 – Vinay 2012-01-04 08:02:45