需求的详细规范是,在请求消息中有一个名称为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>
真正体会到了专业知识的帮助和抱歉的混乱。提前致谢。
您的第一个XSLT示例具有'version =“2.0”',您是否使用XSLT 2.0处理器?并考虑发布一个代表性的XML输入示例以及您想要创建的相应结果,然后我们可以推荐正确的XSLT解决方案。 – 2012-01-02 17:58:28
您需要定义用于删除元素的条件。请编辑问题并添加。 – 2012-01-02 18:18:33
@Vinay:** ** IgnoreEmptyElementInd **适用于整个XML文档,还是仅适用于** UpdMsgRqHdr **元素? – 2012-01-04 08:48:50