我有以下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>
你能帮我一下吗?
你得到了两个,因为你对每个Testing
元素做了一个xsl:for-each
。
您可以尝试对具有匹配@domain
的第一个Testing/Identity
或Testing/Identity
执行xsl:templates
,以最后一个为准。
例子…
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>
一个简单的怎么样?
<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>
元素