这看起来很简单,但我很想生成所需的输出。任何帮助将不胜感激。
输入XML:
<?xml version="1.0" encoding="UTF-8"?>
<Event xmlns="urn:sobject.partner.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Id>00Uc0000001iioEEAQ</Id>
<Subject>TestMeeting2</Subject>
<StartDateTime xsi:nil="true"/>
<Owner>
<Name>dev0044</Name>
<Email>testuser0044@gmail.com</Email>
</Owner>
<Notes_Universal_ID__c xsi:nil="true"/>
<Location>San Jose</Location>
<IsPrivate>false</IsPrivate>
<IsDeleted>false</IsDeleted>
<EndDateTime xsi:nil="true"/>
<Description>test description</Description>
<EventRelations>
<EventRelation>
<EventId>00Uc0000001iioEEAQ</EventId>
<RelationId>005c0000000T9YQAA0</RelationId>
<Relation>
<Email>testuser0045@gmail.com</Email>
</Relation>
</EventRelation>
<EventRelation>
<EventId>00Uc0000001iioEEAQ</EventId>
<RelationId>005c0000000T9YaAAK</RelationId>
<Relation>
<Email>testuser0047@gmail.com</Email>
</Relation>
</EventRelation>
</EventRelations>
必需的输出XML:
<?xml version="1.0" encoding="UTF-8"?>
<CREATEAPPOINTMENT>
<STRUSERNAME>testuser0044</STRUSERNAME>
<STRSTARTDATETIME/>
<STRENDDATETIME/>
<STRSUBJECT>TestMeeting2</STRSUBJECT>
<STRDESCRIPTION>Email : testuser0045@gmail.com, testuser0047@gmail.com. Description: test description</STRDESCRIPTION>
<SRTLOCATION>San Jose</SRTLOCATION>
<STRPRIVATE>0</STRPRIVATE>
<STRAVAILABLE>0</STRAVAILABLE>
</CREATEAPPOINTMENT>
除了描述字段之外,我能够获得所有内容。 STRDESCRIPTION将包含EventRelations / EventRelation / Relation / Email(逗号分隔的电子邮件地址)和实际描述字段的串联。
这是我正在尝试的xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:sf="urn:partner.soap.sforce.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/">
<xsl:output indent="yes" method="xml"/>
<xsl:template match="*:Event">
<xsl:element name="CREATEAPPOINTMENT">
<xsl:element name="STRUSERNAME"><xsl:value-of select="*:Owner/*:Name"/></xsl:element>
<xsl:element name="STRSTARTDATETIME"><xsl:value-of select="*:StartDateTime"/></xsl:element>
<xsl:element name="STRENDDATETIME"><xsl:value-of select="*:EndDateTime"/></xsl:element>
<xsl:element name="STRSUBJECT"><xsl:value-of select="*:Subject"/></xsl:element>
<xsl:variable name="description" select="*:Description"/>
<xsl:element name="SRTDESCRIPTION">
<xsl:for-each select="*:EventRelations/*:EventRelation">
<xsl:variable name="email" select="*:Relation/*:Email"/>
<!-- <xsl:value-of select="concat('Email : ', $email, ' : Description : ')"></xsl:value-of> -->
<xsl:value-of select="$email"/>
<xsl:text>, </xsl:text>
<xsl:value-of select="$description"></xsl:value-of>
<xsl:text>, </xsl:text>
</xsl:for-each>
</xsl:element>
<xsl:element name="SRTLOCATION"><xsl:value-of select="*:Location"/></xsl:element>
<xsl:choose>
<xsl:when test="*:IsPrivate = 'false'">
<xsl:element name="STRPRIVATE">0</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="STRPRIVATE">1</xsl:element>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="*:IsPrivate = 'false'">
<xsl:element name="STRAVAILABLE">0</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="STRAVAILABLE">1</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
答案 0 :(得分:1)
由于您使用的是XSLT 2.0,因此可以使用separator
的{{1}}属性。您也可以使用xsl:value-of
,因此您不必使用xpath-default-namespace
作为前缀。
示例:
*
<强>输出强>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="urn:sobject.partner.soap.sforce.com">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="text()"/>
<xsl:template match="/*">
<CREATEAPPOINTMENT>
<xsl:apply-templates select="(Owner,StartDateTime,EndDateTime,
Subject,Description,Location,IsPrivate)"/>
</CREATEAPPOINTMENT>
</xsl:template>
<xsl:template match="Owner/Name">
<STRUSERNAME><xsl:value-of select="."/></STRUSERNAME>
</xsl:template>
<xsl:template match="StartDateTime">
<STRSTARTDATETIME><xsl:value-of select="."/></STRSTARTDATETIME>
</xsl:template>
<xsl:template match="EndDateTime">
<STRENDDATETIME><xsl:value-of select="."/></STRENDDATETIME>
</xsl:template>
<xsl:template match="Subject">
<STRSUBJECT><xsl:value-of select="."/></STRSUBJECT>
</xsl:template>
<xsl:template match="Description">
<STRDESCRIPTION>
<xsl:text>Email: </xsl:text>
<xsl:value-of select="../EventRelations/*/Relation/Email" separator=", "/>
<xsl:text> DESCRIPTION: </xsl:text>
<xsl:value-of select="."/>
</STRDESCRIPTION>
</xsl:template>
<xsl:template match="Location">
<SRTLOCATION><xsl:value-of select="."/></SRTLOCATION>
</xsl:template>
<xsl:template match="IsPrivate">
<STRPRIVATE><xsl:apply-templates/></STRPRIVATE>
<STRAVAILABLE><xsl:apply-templates/></STRAVAILABLE>
</xsl:template>
<xsl:template match="IsPrivate/text()">
<xsl:choose>
<xsl:when test=".='false'"><xsl:text>0</xsl:text></xsl:when>
<xsl:otherwise><xsl:text>1</xsl:text></xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
注意:元素的顺序与问题中的输出不同。如果订单很重要,您可以在<CREATEAPPOINTMENT>
<STRUSERNAME>dev0044</STRUSERNAME>
<STRSTARTDATETIME/>
<STRENDDATETIME/>
<STRSUBJECT>TestMeeting2</STRSUBJECT>
<STRDESCRIPTION>Email: testuser0045@gmail.com, testuser0047@gmail.com DESCRIPTION: test description</STRDESCRIPTION>
<SRTLOCATION>San Jose</SRTLOCATION>
<STRPRIVATE>0</STRPRIVATE>
<STRAVAILABLE>0</STRAVAILABLE>
</CREATEAPPOINTMENT>
模板中的select
添加xsl:apply-templates
,以指定订单。 (如果有帮助,我可以修改它。)
此外,如果您通过在开头添加“STR”来创建新元素,则可以替换/*
,StartDateTime
,EndDateTime
和{{1}的模板用这一个:
Subject