Xslt 使用XSL从CDATA转换XML
我有这个XML文档:Xslt 使用XSL从CDATA转换XML,xslt,xml-parsing,Xslt,Xml Parsing,我有这个XML文档: <ns0:getDataResponse xmlns:ns0="http://abc.com/"> <return> <wrapper> <data><![CDATA[<?xml version="1.0" encoding="UTF-8"?> <ConDic>
<ns0:getDataResponse xmlns:ns0="http://abc.com/">
<return>
<wrapper>
<data><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<ConDic>
<dictionary>bank</dictionary>
<rows>
<row>
<bic>ABKZKZKX</bic>
<bcode>319</bcode>
<name1>AA "A BANK"</namekz>
<name2>BB "B BANK"</nameru>
</row>
<row>
<bic>ABNAKZKX</bic>
<bcode>922</bcode>
<name1>CC "C BANK"</namekz>
<name2>DD "D BANK"</nameru>
</row>
</rows>
</ConDic>]]></data>
</wrapper>
</return>
</ns0:getDataResponse>
银行
ABKZKX
319
AA“银行”
BB“B银行”
ABNAKZKX
922
抄送“C银行”
DD“D银行”
]]>
如何使用XSL对其进行解析,以获取CDATA中的每一行,从而进行此类选择:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="http://abc.com/">
<xsl:output method="html" />
<xsl:template match="text()|@*"/>
<xsl:template match="ns0:rows">
<select name="bank" id="bank" class="input" style="width: 370px;">
<xsl:for-each select="row">
<xsl:sort select="name1"/>
<option value="{bic}"><xsl:value-of select="name1" /></option>
</xsl:for-each>
</select>
如果您有可用的扩展,您应该能够使用创建内容的变量。尝试类似(未经测试)的方法:
...
正如评论中所建议的,我发布了一个解决方案。该示例将XSLT 3.0与Saxon 9.5结合使用(需要PE或EE版本):
输入
<ns0:getDataResponse xmlns:ns0="http://abc.com/">
<return>
<wrapper>
<data><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<ConDic>
<dictionary>bank</dictionary>
<rows>
<row>
<bic>ABKZKZKX</bic>
<bcode>319</bcode>
<name1>AA "A BANK"</name1>
<name2>BB "B BANK"</name2>
</row>
<row>
<bic>ABNAKZKX</bic>
<bcode>922</bcode>
<name1>CC "C BANK"</name1>
<name2>DD "D BANK"</name2>
</row>
</rows>
</ConDic>]]></data>
</wrapper>
</return>
</ns0:getDataResponse>
银行
ABKZKX
319
AA“银行”
BB“B银行”
ABNAKZKX
922
抄送“C银行”
DD“D银行”
]]>
结果是
<select name="bank" id="bank" class="input" style="width: 370px;">
<option value="ABKZKZKX">AA "A BANK"</option>
<option value="ABNAKZKX">CC "C BANK"</option></select>
AA“银行”
抄送“C银行”
您使用哪个XSLT处理器?您需要具有3.0函数的XSLT 3.0处理器,或者需要支持扩展函数(如)的XSLT 1.0或2.0处理器。转义标记不是有效的XML。没有实体<代码>“已定义,没有DTD引用。即使使用第一次传递转换来提取带有禁用输出转义的CDATA,也会留下无效的标记,无法将其解析为XML。此外,它还包含XML声明,这使得在DOE转换中添加DTD引用更加困难。有没有办法让Web服务的生产者改变他们的输出?定义quot
这样就不必有DTD来定义它。@MartinHonnen,我认为你应该把你的评论放在答案中,这样这个问题就不再属于“未回答”类别。@Yoldar Zi,我的评论有帮助吗?您可以使用提供此类扩展或提供XSLT 3.0支持的处理器吗?node-set()
函数获取结果树片段并将其转换为节点集。它不会接受字符串并将其解析为节点集。因此,$inner
的值充其量只是一个字符串,您将无法选择$inner//row
。
<ns0:getDataResponse xmlns:ns0="http://abc.com/">
<return>
<wrapper>
<data><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<ConDic>
<dictionary>bank</dictionary>
<rows>
<row>
<bic>ABKZKZKX</bic>
<bcode>319</bcode>
<name1>AA "A BANK"</name1>
<name2>BB "B BANK"</name2>
</row>
<row>
<bic>ABNAKZKX</bic>
<bcode>922</bcode>
<name1>CC "C BANK"</name1>
<name2>DD "D BANK"</name2>
</row>
</rows>
</ConDic>]]></data>
</wrapper>
</return>
</ns0:getDataResponse>
<select name="bank" id="bank" class="input" style="width: 370px;">
<option value="ABKZKZKX">AA "A BANK"</option>
<option value="ABNAKZKX">CC "C BANK"</option></select>