Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 使用XSL从CDATA转换XML_Xslt_Xml Parsing - Fatal编程技术网

Xslt 使用XSL从CDATA转换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>

我有这个XML文档:

<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 &quot;A BANK&quot;</namekz>
                                      <name2>BB &quot;B BANK&quot;</nameru>
                                    </row>
                                    <row>
                                      <bic>ABNAKZKX</bic>
                                      <bcode>922</bcode>
                                      <name1>CC &quot;C BANK&quot;</namekz>
                                      <name2>DD &quot;D BANK&quot;</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 &quot;A BANK&quot;</name1>
                                      <name2>BB &quot;B BANK&quot;</name2>
                                    </row>
                                    <row>
                                      <bic>ABNAKZKX</bic>
                                      <bcode>922</bcode>
                                      <name1>CC &quot;C BANK&quot;</name1>
                                      <name2>DD &quot;D BANK&quot;</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 &quot;A BANK&quot;</name1>
                                      <name2>BB &quot;B BANK&quot;</name2>
                                    </row>
                                    <row>
                                      <bic>ABNAKZKX</bic>
                                      <bcode>922</bcode>
                                      <name1>CC &quot;C BANK&quot;</name1>
                                      <name2>DD &quot;D BANK&quot;</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>