【发布时间】:2015-04-23 08:04:31
【问题描述】:
我们正在使用一个返回 XML 的 Web 服务,并且我们正在使用 XSLT 来对日期进行排序并仅将其中的一部分发送到移动客户端。返回给客户端的数据是 JSON 解析的。 在给定参数上,服务返回一个空 XML - 如问题末尾所示。
在这种情况下,我们要做的是弄清楚如何向客户端返回一个空的有效 JSON 对象(即 [])。目前,我们无法更改 Web 服务本身的任何内容。任何想法都会很有帮助。
XML:
<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="http://tempuri.org/">
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:Locale="">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="Events">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" minOccurs="0" />
<xs:element name="boneId" type="xs:int" minOccurs="0" />
<xs:element name="nsId" type="xs:int" minOccurs="0" />
<xs:element name="objId" type="xs:int" minOccurs="0" />
<xs:element name="fileName" type="xs:string" minOccurs="0" />
<xs:element name="Date" type="xs:dateTime" minOccurs="0" />
<xs:element name="ArieId" type="xs:int" minOccurs="0" />
<xs:element name="EventPlaceName" type="xs:string" minOccurs="0" />
<xs:element name="City" type="xs:int" minOccurs="0" />
<xs:element name="PlaceFileName" type="xs:string" minOccurs="0" />
<xs:element name="PlaceBoneId" type="xs:int" minOccurs="0" />
<xs:element name="PlaceNsId" type="xs:int" minOccurs="0" />
<xs:element name="PlaceObjId" type="xs:int" minOccurs="0" />
<xs:element name="TourName" type="xs:string" minOccurs="0" />
<xs:element name="TimeStart" type="xs:string" minOccurs="0" />
<xs:element name="TimeEnd" type="xs:string" minOccurs="0" />
<xs:element name="Genre" type="xs:int" minOccurs="0" />
<xs:element name="Genre_Name" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" />
</DataSet>
XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:h="http://www.w3.org/1999/xhtml">
<xsl:output method="text"/>
<xsl:template match="Events">
{
'Items': [
<xsl:for-each select="//Events">
{
'Name': '<xsl:value-of select="Name"/>',
'Date': '<xsl:value-of select="Date"/>',
'PlaceName': '<xsl:value-of select="EventPlaceName"/>',
'boneId': '<xsl:value-of select="boneId"/>',
'objId': '<xsl:value-of select="objId"/>',
'PlaceNsId': '<xsl:value-of select="PlaceNsId"/>',
'PlaceObjId': '<xsl:value-of select="PlaceObjId"/>',
'StartPoint': '<xsl:value-of select="StartPoint"/>',
'Description': '<xsl:value-of select="Description"/>',
'Telephone': '<xsl:value-of select="Telephone"/>'
},
</xsl:for-each>
]
}
</xsl:template>
</xsl:stylesheet>
来自服务的“常规”XML 响应:
<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="http://tempuri.org/">
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:Locale="">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="Events">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" minOccurs="0" />
<xs:element name="boneId" type="xs:int" minOccurs="0" />
<xs:element name="nsId" type="xs:int" minOccurs="0" />
<xs:element name="objId" type="xs:int" minOccurs="0" />
<xs:element name="fileName" type="xs:string" minOccurs="0" />
<xs:element name="Date" type="xs:dateTime" minOccurs="0" />
<xs:element name="ArieId" type="xs:int" minOccurs="0" />
<xs:element name="EventPlaceName" type="xs:string" minOccurs="0" />
<xs:element name="City" type="xs:int" minOccurs="0" />
<xs:element name="PlaceFileName" type="xs:string" minOccurs="0" />
<xs:element name="PlaceBoneId" type="xs:int" minOccurs="0" />
<xs:element name="PlaceNsId" type="xs:int" minOccurs="0" />
<xs:element name="PlaceObjId" type="xs:int" minOccurs="0" />
<xs:element name="TourName" type="xs:string" minOccurs="0" />
<xs:element name="TimeStart" type="xs:string" minOccurs="0" />
<xs:element name="TimeEnd" type="xs:string" minOccurs="0" />
<xs:element name="Genre" type="xs:int" minOccurs="0" />
<xs:element name="Genre_Name" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<NewDataSet xmlns="">
<Events diffgr:id="Events1" msdata:rowOrder="0">
<Name>Name</Name>
<boneId>1855</boneId>
<nsId>305</nsId>
<objId>28</objId>
<fileName>tours_item_show.aspx</fileName>
<ArieId>1</ArieId>
<EventPlaceName>Place name</EventPlaceName>
<City>392</City>
<PlaceFileName>show_item_place.aspx</PlaceFileName>
<PlaceBoneId>1563</PlaceBoneId>
<PlaceNsId>201</PlaceNsId>
<PlaceObjId>2574</PlaceObjId>
<TourName>Tour name</TourName>
<Genre>18</Genre>
<Genre_Name>Group tours</Genre_Name>
</Events>
</NewDataSet>
</diffgr:diffgram>
</DataSet>
【问题讨论】:
-
"在给定参数上,服务返回一个空 XML - 如问题末尾所示。" 我看不出你在哪里显示。这样做非常重要,因为没有空 XML 这样的东西。如果必须至少有一个根元素 - 否则它根本不是 XML。
-
顺便说一句,我认为您错误地发布了 XSD,而不是实际 XML 响应的示例。因此,请编辑我们的问题并提供 两个 XML 输入示例:一个“常规”示例和一个“空”示例。
-
我附加的 XML 是从服务返回的实际响应。我在原始问题中添加了“常规”。