将字符串变量(以xml格式)转换为最终xml的一部分

时间:2011-01-24 18:33:47

标签: xslt

我在xsl文件中有一个变量(varXml),它实际上保留了类似xml的变量:<apps><det id="aaaa"><det key="name"><det id="12"/><tur key="34" id="00x"/></det></det></apps>

xsl文件的格式如下所示:

<xsl:element name="opersApps">
   <xsl:attribute name="sts">1</xsl:attribute>
   <xsl:value-of select="$varXml"/>
</xsl:element>

结果是:

<opersApps sts="1">

<apps><det id="aaaa"><det key="name"><det id="12"/><tur key="34" id="00x"/></det></det></apps>

</opersApps>

现在看起来像here

中间部分(变量varXml)不看xml。如何将它集成为xml的一部分? 我希望看起来像这样:

<opersApps sts="1">
<apps>
    <det id="aaaa">
        <det key="name">
            <det id="12"/>
            <tur key="34" id="00x"/>
        </det>
    </det>         
</apps>
</opersApps>

感谢。

稍后编辑: varXml看起来像这样:

 String varXml ="<det id=\"aaaa\">\n" +
                "    <det key=\"name\">\n" +
                "        <det id=\"12\"/>\n" +
                "        <tur key=\"34\" id=\"00x\"/>\n" +
                "    </det>\n" +
                "</det> ";

2 个答案:

答案 0 :(得分:3)

有两种方法。

(a)将XML字符串解析为树,然后使用XSLT指令(例如,xsl:copy-of)将其作为树进行操作。在XSLT中没有解析XML字符串的标准方法,但许多产品都有扩展(例如saxon:parse())或允许您自己编写。

(b)使用disable-output-escaping =“yes”将XML字符串复制到序列化输出。这不适用于所有环境 - 它取决于支持该功能的处理器以及在使用XSLT处理器的序列化程序的环境中运行。但它是为数不多的可以证明禁用输出转义的用例之一。

答案 1 :(得分:2)

在纯XSLT / XPath (版本1.0和2.0)中无法进行此类转换。

最佳建议:永远不要将XML文档或片段表示为字符串 - 这会破坏标记并将其展平为一维文本。

如果无法更改变量的值以包含实际标记,则需要将此变量传递给扩展函数,该函数将解析字符串并返回实数XML文档。

另一种可能的解决方案是使用disable-output-escaping属性,但这不能保证在所有XSLT处理器上都能正常工作,并严重违反XSLT体系结构模型。

我建议始终避免使用DOE