我从Web服务接收xml数据,该数据将所有数据作为一个转义的xml字符串返回。但无论出于何种原因,xml的一部分都包含在cdata标记中。 cdata中的转义xml通常也包含转义的xml字符。例如:
<root>
<importData>dat</importData>
<Response>
<![CDATA[<SecondRoot>
<Data>123</Data>
<DataEscapedCharacterIncluded> 3 > 1</DataEscapedCharacterIncluded>
</SecondRoot>]]>
</Response>
</root>
我需要使用xsl将cdml内部和外部的xml转换为另一种xml格式,但我很难弄清楚如何将其转换为可用的xml格式,使用c#或xsl所以我可以将xsl转换为不同的格式。我希望它看起来如下:
<root>
<importData>dat</importData>
<Response>
<SecondRoot>
<Data>123</Data>
<DataEscapedCharacterIncluded> 3 > 1</DataEscapedCharacterIncluded>
</SecondRoot>
</Response>
<root>
答案 0 :(得分:0)
您显示的数据可能无法正确转义。如果你忽视它,它可能会产生格式不正确的XML。考虑这一行:
<DataEscapedCharacterIncluded> 3 > 1</DataEscapedCharacterIncluded>
如果你无视它,它就会变成这样:
<DataEscapedCharacterIncluded> 3 > 1</DataEscapedCharacterIncluded>
这仍然有效(大于 - 不需要转义),但我认为你在那里也会有<
,必须被转义。如果双重逃脱,你应该没事。
要对此进行转换,您可以执行以下操作:
disable-output-escaping
设置为yes
,另一个设置为unescaping
一个人做了实际的改造。fn:parse-xml
或
fn:parse-xml-fragment
,可以将XML-as-a-string视为
输入从你的帖子中不完全清楚的是它是否被双重逃脱。即,如果您的数据如下所示:
<elem><![CDATA[<root>bla</root>]]></elem>
它是单独逃脱的。如果它看起来像这样:
<elem><![CDATA[<root>bla</root>]]></elem>
它是双重逃脱的。在后一种情况下,您需要先进行额外的unescape循环才能处理它。