如何在 XSLT 的 CData (Java) 中包装 HTML 内容 - XML 到 HTML

How to wrap HTML content in CData (Java) for XSLT - XML to HTML

在这里努力将 HTML 内容包装在 CData 中,使用 Java。最终目标是通过 XSLT 将 XML 转换为 HTML。 CData 是一项要求。因此,我希望 XSLT 忽略 HTML 但我显然做错了什么,因为它没有保留 HTML.

<?xml version="1.0" encoding="utf-8" ?>

<content>
    <records>
        <record>
            <param1>1</param1>
            <param2>25</param2>
            <param3>34</param3>
            <param4>b</param4>
            <param5>
                <p>this is html that should be wrapped with CData including the p tags.</p>
            </param5>
        </record>
    </records>
</content>

代码如下:

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse("test.xml");

doc.getDocumentElement().normalize();

Element param5 = (Element)doc.getElementsByTagName("param5").item(0);
CDATASection cdata = doc.createCDATASection(param5.getTextContent());
param5.appendChild(cdata);

DOMResult domResult = new DOMResult();

transform.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "param5");
transform.transform(new DOMSource(doc) , domResult);

因此,对于 param5,XML 文件在转换之前类似于:

<param5> 
    <![CDATA[
        this is html that should be wrapped with CData including the p tags.
    ]]>
</param5>

当我想要的时候

<param5> 
    <![CDATA[
        <p>this is html that should be wrapped with CData including the p tags.</p>
    ]]>
</param5>

我不知道我在这里做错了什么。

如有任何帮助,我们将不胜感激。谢谢。

XSL 非常简单:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <h1><xsl:value-of select="content/records/record/param5"/></h1>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

这是我需要的示例 HTML 输出:

<html>
    <body>
        <h1>
            <p>this is html that should be wrapped with CData including the p tags.</p>
        </h1>
    </body>
</html>

我尽量不让事情复杂化。基本问题是我希望 CData 包含 HTML 内容和 HTML 标签。 getTextContent() 忽略 p 标签。如果有一种方法可以抓取 param5 中的所有内容,我会被设置。

如果你想创建一个带有 DOM 节点标记的 CDATA 部分,那么你首先需要序列化这些节点,这可以在 Java 中使用默认转换器或 DOM Load/Save API。所以我会创建一个文档片段节点并将参数的所有子节点附加到文档片段,将文档片段序列化为一个字符串然后你可以使用你的代码创建一个 CDATA 部分并将它附加到参数。

这是一个简单的例子,需要的import

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.DocumentFragment;


import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSSerializer;

然后在文档中读取并查找元素的代码与您发布的相同,并且 DocumentFragment 用于 assemble 从元素中删除的所有子节点:

        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        docFactory.setNamespaceAware(true);

        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

        Document doc = docBuilder.parse("sample1.xml");

        DocumentFragment frag1 = doc.createDocumentFragment();

        Element param = (Element)doc.getElementsByTagName("param5").item(0);

        while (param.hasChildNodes())
        {
            frag1.appendChild(param.getFirstChild());
        }

然后 LSSerializer 有一个 writeToString 方法:

        DOMImplementationLS lsImp = (DOMImplementationLS)doc.getImplementation();

        LSSerializer ser = lsImp.createLSSerializer();
        ser.getDomConfig().setParameter("xml-declaration", false);

        String xml = ser.writeToString(frag1);

        System.out.println(xml);

        param.appendChild(doc.createCDATASection(xml));

        System.out.println(ser.writeToString(doc));

文件看起来像

<content>
    <records>
        <record>
            <param1>1</param1>
            <param2>25</param2>
            <param3>34</param3>
            <param4>b</param4>
            <param5><![CDATA[
                <p>this is html that should be wrapped with CData including the p tags.</p>
            ]]></param5>
        </record>
    </records>
</content>

Java 世界的某个人需要告诉您转换为 DOMImplementationLS lsImp = (DOMImplementationLS)doc.getImplementation(); 是否可靠,或者您是否需要使用注册表,如 http://www.java2s.com/Tutorial/Java/0440__XML/GeneratesaDOMfromscratchWritestheDOMtoaStringusinganLSSerializer.htm 所示。