我有下面的XML
<XML>
<Header>
<From>
<Testing
domain="testerID">
<Identity>76w787w7-T</Identity>
</Testing>
<Testing domain="NetWorkid">
<Identity>2382232-t</Identity>
</Testing>
</From>
</Header>
</XML>我正在尝试实现以下逻辑
1)如果任意域具有值= ' networkid‘,则最终输出将特定标识2)如果没有域是网络is,则填充第一标识
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>
你能帮帮我吗?
发布于 2014-07-12 04:05:01
因为要对每个Testing元素执行一个xsl:for-each,所以可以同时获得这两个元素。
您可以尝试对第一个Testing/Identity或具有匹配的@domain的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>发布于 2014-07-12 04:11:52
来个简单的怎么样?
<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>元素。
https://stackoverflow.com/questions/24705440
复制相似问题