xslt - 如何在XSLt 2.0中为每个循环丢弃重复结构。

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

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

成功案例输入:

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


问题:
如果Input请求具有类型A的Partner元素,则其标识符应映射到传出请求,并且如果Input请求中不包含该Partner元素,则应创建一个空字段。但是由于我必须使用“ for-each”,因此还有其他逻辑可以用来丢弃重复结构。

最佳答案

如果只需要一个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将根据需要为空。

关于xslt - 如何在XSLt 2.0中为每个循环丢弃重复结构。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33209644/

相关文章:

html - 如何使用 xpath 从 div 获取 href 值?

xml - XSL Sort 将小写字母与大写字母分开处理

xml - XSLT:如何在 "match"属性中表示 OR?

xslt - 在结果文档中生成空/空白命名空间声明

xml - XSLT 忽略模板中的元素?

Python 3.6 Selenium 如何通过父节点的引用找到子节点(xPath)

java - 有没有办法为 Java 文档提供用于 XPath 查询的 XML 模式

xml - 如果属性值不等于某些值,如何获取它们?

带有 C# 代码的 XSLT

xslt-1.0 - 读取 JSON 键值并将其存储在 XSLT 变量中