【问题标题】:How to discard repetition structure in for each loop in XSLt 2.0.如何在 XSLt 2.0 中为每个循环丢弃重复结构。
【发布时间】:2015-10-19 08:16:23
【问题描述】:

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

成功案例输入:

<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 的合作伙伴元素,则它的标识符应映射到传出请求,如果输入请求不包含该合作伙伴元素,则应创建一个空字段。但是由于我必须使用 "for-each" ,所以是否有任何额外的逻辑可以用来丢弃重复结构。

【问题讨论】:

    标签: xslt xpath xslt-1.0 xslt-2.0 xslt-grouping


    【解决方案1】:

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

    <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 将根据需要为空。

    【讨论】:

      猜你喜欢
      • 2022-06-10
      • 2015-05-11
      • 2021-11-09
      • 1970-01-01
      • 2018-06-13
      • 2014-07-31
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      相关资源
      最近更新 更多