如何在XSLt 2.0中丢弃每个循环中的重复结构



我需要将一个重复的结构映射到输出xml中的单个字段,这样,如果Success Case匹配,则只映射必需的字段,而在Alternate场景中,该字段应在传出请求中为空。我在处理成功流程备用流程时遇到了麻烦。

成功案例输入:

<Message>
<MessageName>Hello World</MessageName>  
<Data>
    <Partner>
        <PartnerType>A</PartnerType>
        <ParnterId>01</ParnterId>
    </Partner>
    <Partner>
        <PartnerType>B</PartnerType>
        <ParnterId>02</ParnterId>
    </Partner>
    <Partner>
        <PartnerType>C</PartnerType>
        <ParnterId>03</ParnterId>
    </Partner>
    <Partner>
        <PartnerType>D</PartnerType>
        <ParnterId>04</ParnterId>
    </Partner>
</Data>
</Message>

预期输出:

<Request>
<RequestName>Hello World</RequestName>  
<PartnerAIdentifier>01</PartnerAIdentifier>
</Request>

当前输出:

<?xml version="1.0" encoding="UTF-8"?>
<Request>
   <RequestName>Hello World</RequestName>
   <PartnerAIdentifier>01</PartnerAIdentifier>
   <PartnerAIdentifier/>
   <PartnerAIdentifier/>
   <PartnerAIdentifier/>
</Request>

备用大小写输入:

<Message>
<MessageName>Hello World</MessageName>  
<Data>
    <Partner>
        <PartnerType>B</PartnerType>
        <ParnterId>02</ParnterId>
    </Partner>
    <Partner>
        <PartnerType>C</PartnerType>
        <ParnterId>03</ParnterId>
    </Partner>
    <Partner>
        <PartnerType>D</PartnerType>
        <ParnterId>04</ParnterId>
    </Partner>
</Data>
</Message>

备用大小写期望输出:

<Request>
<RequestName>Hello World</RequestName>  
<PartnerAIdentifier></PartnerAIdentifier>
</Request>

交流电流输出:

<?xml version="1.0" encoding="UTF-8"?>
<Request>
   <RequestName>Hello World</RequestName>
   <PartnerAIdentifier/>
   <PartnerAIdentifier/>
   <PartnerAIdentifier/>
</Request>
我的XSLt

:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="2.0">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/Message">
        <Request>
        <RequestName>
            <xsl:value-of select="MessageName" />
        </RequestName>
        <xsl:for-each select="Data/Partner">
            <xsl:choose>
            <xsl:when test="PartnerType ='A'">
             <PartnerAIdentifier>
               <xsl:value-of select="ParnterId" />
             </PartnerAIdentifier>
            </xsl:when>
            <xsl:otherwise>
            <PartnerAIdentifier>
            </PartnerAIdentifier>
            </xsl:otherwise>
            </xsl:choose>

        </xsl:for-each>

        </Request>
        </xsl:template>
        </xsl:stylesheet>

问题:如果输入请求有一个类型为a的Partner元素,那么它的Identifier应该映射到传出请求,如果输入请求不包含Partner元素,那么应该生成一个空字段。但是既然我必须使用"for-each",那么我是否可以使用任何额外的逻辑来丢弃重复结构?

如果您只想要一个PartnerAIdentifier输出,则不需要在这里使用xsl:for-each。您可以将测试条件放在单个xsl:value-of中的PartnerType

<xsl:value-of select="Data/Partner[PartnerType='A']/ParnterId" />

试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="2.0">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/Message">
        <Request>
            <RequestName>
                <xsl:value-of select="MessageName" />
            </RequestName>
             <PartnerAIdentifier>
               <xsl:value-of select="Data/Partner[PartnerType='A']/ParnterId" />
             </PartnerAIdentifier>
        </Request>
    </xsl:template>
</xsl:stylesheet>

因此,如果没有PartnerType,那么PartnerAIdentifier将根据需要为空

相关内容

  • 没有找到相关文章

最新更新