xalan:nodeset不呈现任何节点而只呈现文本

时间:2017-01-29 02:04:08

标签: xml xslt xalan

我有一个输入xml文件,其中包含一个元素,该元素又包含xml文本。我想读取元素文本,然后将其转换为节点集,以便我可以使用xpath搜索。这是作品:

<TEMPLATE_STRUCTURE_XML><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<TRANSACTION>
<VERSION>1.3</VERSION>
<SCREEN>something123</SCREEN>
</TRANSACTION>
]]></TEMPLATE_STRUCTURE_XML>

在这种情况下,我希望得到值 something123

问题是,如果我把(硬编码)内部xml文件的部分放在xsl中, xalan:nodeset()工作正常,但是当我使用时它不起作用XSL:value-of的即可。 oXygen XMLeditor向我展示了value-of的结果已成为纯文本,而不是节点。

以下作品:

    <xsl:variable name="statementSummaryData">
        <ss_Set>
            <TRANSACTION>
                <VERSION>1.3</VERSION>
                <SCREEN>something123
                </SCREEN>
            </TRANSACTION>
        </ss_Set>
    </xsl:variable>
    <xsl:variable xmlns:xalan="http://xml.apache.org/xalan" name="ssTemplatesNodeSet" select="xalan:nodeset($statementSummaryData)"/>
    <xsl:value-of select="substring-before($ssTemplatesNodeSet//SCREEN,' ')"/>

以下不起作用。 &lt; ss_Set&gt; 元素成为节点,但value-of的输出变为&lt; ss_Set&gt;内的纯文本:

    <xsl:variable name="statementSummaryWithHeader">
           <xsl:value-of select="TEMPLATE_STRUCTURE_XML" disable-output-escaping="yes"/>
    </xsl:variable>
    <xsl:variable name="statementSummaryWithNoHeader">
    <xsl:value-of select="substring-after($statementSummaryWithHeader,'?>')" disable-output-escaping="yes"/>
    </xsl:variable>
<xsl:variable name="statementSummaryData">
    <ss_Set>
    <xsl:value-of select="$statementSummaryWithNoHeader" disable-output-escaping="yes"/>
    </ss_Set>
</xsl:variable>
<xsl:variable xmlns:xalan="http://xml.apache.org/xalan" name="ssTemplatesNodeSet" select="xalan:nodeset($statementSummaryData)"/>
<xsl:value-of select="substring-before($ssTemplatesNodeSet//SCREEN,' ')"/>

以下情况也不起作用:

    <xsl:variable name="statementSummaryWithHeader">
           <xsl:value-of select="TEMPLATE_STRUCTURE_XML" disable-output-escaping="yes"/>
    </xsl:variable>
    <xsl:variable name="statementSummaryWithNoHeader">
    <xsl:value-of select="substring-after($statementSummaryWithHeader,'?>')" disable-output-escaping="yes"/>
    </xsl:variable>
    <xsl:variable name="statementSummaryData">
        <ss_Set>
           <xsl:value-of xmlns:xalan="http://xml.apache.org/xalan" select="xalan:nodeset($statementSummaryWithNoHeader)"/>
        </ss_Set>
    </xsl:variable>
    <xsl:variable xmlns:xalan="http://xml.apache.org/xalan" name="ssTemplatesNodeSet" select="xalan:nodeset($statementSummaryData)"/>
    <xsl:value-of select="substring-before($ssTemplatesNodeSet//SCREEN,' ')"/>

1 个答案:

答案 0 :(得分:0)

你正在搅拌苹果和橘子。 node-set()函数可以使用结果树片段并将其转换为节点集。它无法将 CDATA 转换为可解析的标记。

要了解您可以执行的操作以提取所需的字符串,请参阅:
https://stackoverflow.com/a/37777846/3016153