我有以下XML
<XML>
<Header>
<From>
<Testing
domain="testerID">
<Identity>76w787w7-T</Identity>
</Testing>
<Testing domain="NetWorkid">
<Identity>2382232-t</Identity>
</Testing>
</From>
</Header>
</XML>
我正在尝试实现以下逻辑
1)如果任何域具有value ='networkId',那么最终输出将是该特定标识 2)如果域名都不是networkid,则填充第一个身份
XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="Sender_ID"/>
<xsl:template match="XML">
<OutputHeader>
<xsl:for-each select="Header/From/Testing">
<xsl:choose>
<xsl:when test="contains('|Networkid|NetworkId|NetworkID|networkid|networkId|networkID|netWorkid|netWorkId|netWorkID||NETWORKID|NetWorkid|NetWorkId|NetWorkID|',concat('|',@domain,'|'))">
<Sender>
<xsl:value-of select="Identity" />
</Sender>
</xsl:when>
<xsl:otherwise>
<Sender>
<xsl:value-of select="Identity[1]"/>
</Sender>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</OutputHeader>
</xsl:template>
</xsl:stylesheet>
预期产出:
<OutputHeader>
<Sender>2382232-t</Sender>
</OutputHeader>
实际输出:
<OutputHeader>
<Sender>76w787w7-T</Sender>
<Sender>2382232-t</Sender>
</OutputHeader>
你能帮我解决这个问题。
答案 0 :(得分:1)
你得到两者都是因为你对xsl:for-each
元素进行了Testing
。
您可以尝试xsl:templates
对Testing/Identity
或Testing/Identity
匹配的@domain
进行匹配,以最后者为准。
示例...
XML输入
<XML>
<Header>
<From>
<Testing
domain="testerID">
<Identity>76w787w7-T</Identity>
</Testing>
<Testing domain="NetWorkid">
<Identity>2382232-t</Identity>
</Testing>
</From>
</Header>
</XML>
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:template match="/*/Header/From">
<OutputHeader>
<xsl:apply-templates select="((Testing/Identity)[1]|Testing[translate(@domain,$upper,$lower)='networkid']/Identity)[last()]"/>
</OutputHeader>
</xsl:template>
<xsl:template match="Identity">
<Sender><xsl:value-of select="."/></Sender>
</xsl:template>
</xsl:stylesheet>
<强>输出强>
<OutputHeader>
<Sender>2382232-t</Sender>
</OutputHeader>
答案 1 :(得分:1)
一个简单的怎么样?
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<OutputHeader>
<xsl:for-each select="XML/Header/From/Testing[@domain='NetWorkid']">
<Sender><xsl:value-of select="Identity"/></Sender>
</xsl:for-each>
<xsl:if test="not(XML/Header/From/Testing[@domain='NetWorkid'])">
<Sender>
<xsl:value-of select="XML/Header/From/Testing[1]/Identity"/>
</Sender>
</xsl:if>
</OutputHeader>
</xsl:template>
</xsl:stylesheet>
注意:如果有<Testing domain="NetWorkid">
的多个实例,您没有说明会发生什么。以上内容将为每个元素创建一个<Sender>
元素。