使用XSL从CDATA转换XML

Eld*_*dar 10 xslt xml-parsing

我有这个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>
Run Code Online (Sandbox Code Playgroud)

我如何用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>
Run Code Online (Sandbox Code Playgroud)

Phi*_*ham 0

如果您有可用的exslt扩展,您应该能够使用它exslt:node-set来创建内容变量。尝试类似的东西(未经测试):

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:exsl="http://exslt.org/common"
   extension-element-prefixes="exsl"
   exclude-result-prefixes="exsl"
   version="1.0">

<xsl:template match="/">
    <xsl:variable name="inner" select="exsl:node-set(//data/text())" />
    <select name="bank" id="bank" class="input" style="width: 370px;">
        <xsl:for-each select="$inner//row">
            ...
        </xsl:for-each>
    </select>
</xsl:template>

</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)