【问题标题】:Render generic XML as HTML将通用 XML 呈现为 HTML
【发布时间】:2012-02-05 23:41:09
【问题描述】:

我编写了一个 Web 服务(用 Java 编写),它生成了一个(相当复杂的)XML 文档。

如果需要,我需要返回文档的 HTML 呈现。不必花哨,使用一些基本格式(例如正确缩进元素)显示 XML 源代码就可以了。

我该怎么做?

【问题讨论】:

  • 您需要漂亮的打印机而不是 html 转换器。浏览器显示纯文本就好了。
  • 我也遇到过类似的问题,取了IE默认的XSL,修改了一下:superuser.com/questions/432354/…

标签: java html xml rendering


【解决方案1】:

我同意,XSL 将是最好的方法。如果你想把它变成看起来像 XML 的东西,但只是在 HTML 中,你可以使用这样的东西:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <!-- Evaluate Attributes -->
    <xsl:template match="@*">
        <span class="attribute">
            <span class="name">
                <xsl:value-of select="name()"/>
            </span>="<span class="value"><xsl:value-of select="." /></span>"
        </span>
    </xsl:template>


    <!-- Evaluate Elements -->
    <xsl:template match="*" priority="10">
        <div class="element">
            <!-- First, create the opening tag with the attributes -->
            &lt;<span class="name"><xsl:value-of select="name()"/></span><xsl:apply-templates select="@*"/>&gt;
            <!-- Then, add children -->
            <xsl:apply-templates select="node()"/>
            <!-- Finally, add the closing tag -->
            &lt;/<span class="name"><xsl:value-of select="name()"/></span>&gt;
        </div>
    </xsl:template>


    <!-- Just copy everything else (text, comments, etc.) -->
    <xsl:template match="node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

并添加一些 CSS:

.element{margin-left:4em;font-size:14px;}
.element .name{color:blue;}
.attribute{margin-left:8px}

更新:

<!-- Root node -->
<xsl:template match="/">
    <div class="element">
        &lt;<span class="name"><xsl:value-of select="name()"/></span><xsl:apply-templates select="@*"/>
        <!-- Grab all namespaces and declare them.  distinct-values() is XPath 2.0, however. -->
        <xsl:for-each select="distinct-values(//namespace::*)">
            xmlns:<xsl:value-of select="name()" />="<xsl:value-of select="." />"
        </xsl:for-each>
        &gt;
        <xsl:apply-templates select="node()"/>
        &lt;/<span class="name"><xsl:value-of select="name()"/></span>&gt;
    </div>
</xsl:template>

【讨论】:

  • 就是这样!唯一缺少的是它吞下了命名空间声明。有什么办法保留它们?
  • 对。 xmlns 属性不是普通属性。如果要在根节点中插入所有声明,请添加另一个模板以获取文档的所有命名空间并预先声明它们。
【解决方案2】:

您可以为您的 XML 文档配备通用 CSS 样式表:

<?xml version="1.0" encoding="iso-8859-1" standalone="no" ?>
<?xml-stylesheet type="text/css" href="mystyle.css" ?>
<!-- your main document -->

或者,您也可以提供一个 XSLT 样式表,将您的文档转换为 HTML 文档:

<?xml version="1.0" encoding="iso-8859-1" standalone="no" ?>
<?xml-stylesheet type="text/xsl" href="transform_to_html.xsl" ?>
<!-- your main document -->

前一种方法可能更简单、更直接,因为现在大多数现代浏览器都显示任意样式的 XML 文档树。缺点是您需要为 每个 元素类型定义所有基本风格属性(最明显的是display)。

【讨论】:

  • 在这种情况下 XSL 样式表是什么?
  • @Carsten:复杂。 Here is a skeleton example。请注意它是如何创建一个本身用 CSS 样式表 XML 处理指令装饰的 HTML 文档树的。 XSLT 是一种相当复杂和复杂的语言。
【解决方案3】:

听起来像是XLST 可能有用的东西。

你有什么样的环境/库可用?

【讨论】:

  • XSLT 是一种可能,但 XSL 用于格式化通用 XML 是什么?
  • 我认为您是在要求不存在的“魔术子弹”。可以转换 任何 XML 的 XSLT 必须非常通用,才能产生可​​怕的输出。
  • 一个可以很好地打印 XML 源的 XLS,例如缩进元素等就足够了。
  • 您是说希望 XML 显示为 XML,即尖括号可见?
  • 是的,打印精美的 XML 源代码正是我所追求的。像着色元素和可折叠元素这样花哨的东西会很好,但不是必需的。
【解决方案4】:

如果我理解您的问题,您希望将您的 XML 文档转换为 HTML。有许多技术可以做到这一点,包括解析 XML 和生成 HTML。但我推荐的是使用 XSLT。 XSLT 允许您轻松地将 XML 转换为任何其他 XML(包括 XHTML)。

参考文献

http://www.w3schools.com/xsl/
http://zvon.org/comp/m/xslt.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多