【问题标题】:xalan:nodeset not rendering any node but just textxalan:nodeset 不呈现任何节点,而只是呈现文本
【发布时间】:2017-01-29 02:04:08
【问题描述】:

我有一个输入 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,' ')"/>

以下不起作用。 元素变成了一个节点,但是value-of的输出变成了里面的纯文本:

    <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,' ')"/>

【问题讨论】:

    标签: xml xslt xalan


    【解决方案1】:

    您正在混合苹果和橙子。 node-set() 函数可以采用 result-tree-fragment 并将其转换为 node-set。它不能将 CDATA 变成可解析的标记。

    要了解如何提取所需的字符串,请参阅:
    https://stackoverflow.com/a/37777846/3016153

    【讨论】:

    • 我相信有一些 node-set() 的实现,如果给定一个字符串,它将对其执行 parse-xml() ——但我不知道 Xalan 实现是否是其中之一。
    • @MichaelKay 我相信我们之前有过这样的对话。我不知道有任何node-set() 实现会这样做。我确定 Xalan 不会:xsltransform.net/bFWR5EF
    • 好的,我知道了。因此,我将使用 substring-before 和 sub-string after 来获取该特定内部元素的输出;但是,我只是看到了另一种方法,即通过使用 创建节点来动态构建树。欲了解更多信息,请访问此处(感谢 Michael 的帮助):stackoverflow.com/questions/5418493/…
    • @guasqueño 你不能这样做并保留层次结构。您需要一个 XML 解析器 - 使用 XSLT 构建一个解析器是不可行的,当然不是 XSLT 1.0。
    • @michael.hor257k 我现在找不到任何以这种方式工作的 xx:node-set() 实现的证据。这是针对撒克逊人的错误报告的民间记忆(我敢肯定,不止一个)声称它应该以这种方式工作,因为它在其他产品中也是如此。或许这些产品已经不在我们身边了。
    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多