如何在 XSLt 2.0 的每个循环中丢弃重复结构。
How to discard repetition structure in for each loop in XSLt 2.0.
我需要将重复结构映射到输出 xml 中的单个字段,这样如果 Success 大小写匹配,则只有必填字段应该是映射和 在备用方案中,该字段应在传出请求中设为空。
我在处理 Success Flow 和 Alternate flow.
时遇到了麻烦
成功案例输入:
<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" ,所以是否有任何额外的逻辑可以用来丢弃重复结构。
如果你只想要一个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
将根据需要为空。
我需要将重复结构映射到输出 xml 中的单个字段,这样如果 Success 大小写匹配,则只有必填字段应该是映射和 在备用方案中,该字段应在传出请求中设为空。 我在处理 Success Flow 和 Alternate flow.
时遇到了麻烦成功案例输入:
<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" ,所以是否有任何额外的逻辑可以用来丢弃重复结构。
如果你只想要一个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
将根据需要为空。