使用多个表示将XML转换为HTML

时间:2016-06-22 11:59:17

标签: xslt

我的XML包含一些资源的描述。我想用JSON,XML等代表此资源构建HTML。

这是XML:

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <resource name="item">
        <parameters>
            <parameter name="id">
                <example-value>1234</example-value>
                <type>integer</type>
            </parameter>
            <parameter name="name">
                <example-value>parameter</example-value>
                <type>string</type>
            </parameter>
            <parameter name="timestamp">
                <example-value>1466589751</example-value>
                <type>integer</type>
            </parameter>
            <parameter name="status">
                <example-value>1</example-value>
                <type>integer</type>
            </parameter>
        </parameters>
    </resource>
</resources>

以下是我的表现方式:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <html>
            <xsl:apply-templates/>
        </html>
    </xsl:template>
    <xsl:template match="resources">
        <body>
            <xsl:apply-templates/>
        </body>
    </xsl:template>
    <xsl:template match="resource">
        <div>
            <h2>
                <xsl:value-of select="@name"/>
            </h2>
            <xsl:apply-templates/>
        </div>
    </xsl:template>
    <xsl:template match="parameters">
        <h3>
            <xsl:text>Examples</xsl:text>
        </h3>
        <div>
            <xsl:call-template name="CSVExample"/>
            <xsl:call-template name="TableExample"/>
            <xsl:call-template name="JSONExample"/>
            <xsl:call-template name="XMLExample"/>
        </div>
    </xsl:template>
    <xsl:template name="CSVExample">
        <div>
            <pre>
                <xsl:for-each select="parameter">
                    <xsl:value-of select="concat('&quot;',@name,'&quot;')"/>
                    <xsl:if test="position() &lt; last()">
                        <xsl:text>,</xsl:text>
                    </xsl:if>
                </xsl:for-each>
                <xsl:text>&#xa;</xsl:text>
                <xsl:for-each select="parameter">
                    <xsl:value-of select="concat('&quot;',example-value,'&quot;')"/>
                    <xsl:if test="position() &lt; last()">
                        <xsl:text>,</xsl:text>
                    </xsl:if>
                </xsl:for-each>
            </pre>
        </div>
    </xsl:template>
    <xsl:template name="TableExample">
        <div>
            <pre>
                <table>
                    <tr>
                        <xsl:for-each select="parameter">
                            <th>
                                <xsl:value-of select="@name"/>
                            </th>
                        </xsl:for-each>
                    </tr>
                    <tr>
                        <xsl:for-each select="parameter">
                            <td>
                                <xsl:value-of select="example-value"/>
                            </td>
                        </xsl:for-each>
                    </tr>
                </table>
            </pre>
        </div>
    </xsl:template>
    <xsl:template name="JSONExample">
        <div>
            <pre>
                <xsl:text>{</xsl:text>
                <xsl:for-each select="parameter">
                    <xsl:value-of select="concat('&quot;',@name,'&quot;:')"/>
                    <xsl:if test="type = 'string'">
                        <xsl:text>"</xsl:text>
                    </xsl:if>
                    <xsl:value-of select="example-value"/>
                    <xsl:if test="type = 'string'">
                        <xsl:text>"</xsl:text>
                    </xsl:if>
                    <xsl:if test="position() &lt; last()">
                        <xsl:text>,</xsl:text>
                    </xsl:if>
                </xsl:for-each>
                <xsl:text>}</xsl:text>
            </pre>
        </div>
    </xsl:template>
    <xsl:template name="XMLExample">
        <div>
            <pre>
                <parameters>
                    <xsl:for-each select="parameter">
                        <xsl:element name="{@name}">
                            <xsl:value-of select="example-value"/>
                        </xsl:element>
                    </xsl:for-each>
                </parameters>
            </pre>
        </div>
    </xsl:template>
</xsl:stylesheet>

你认为这是做这种情况的正确方法吗?我的意思是模板结构,调用,应用等。 我是否可以用一些应用模板替换每个?我在某个地方读到了更好的避免 - 每个人都支持apply-templates。但在这种情况下是真的吗?

1 个答案:

答案 0 :(得分:1)

我确信我们可以讨论许多替代方法来重写你的xsl,但说实话,这不是正确的论坛 - 你应该在Stack Exchange上使用那个代码审查论坛。

那就是说,我认为你的xsl结构通常很好 - 比我们在这个网站上看到的更好!

但是,如果&lt; parameters&gt;退出没有任何子项&lt;&lt;参数&gt;节点调用模板仍然会生成不需要的(?)内容。

最好将apply-templates与mode属性一起使用。

<xsl:template match="properties" mode="CSVExample">
....
</xsl:template>

并用

替换调用模板
<xsl:apply-templates select="." mode="CSVExample"/>

至于决定for-each或apply-templates:当使用select =“”时,我认为通常不管你选择哪种方式。就个人而言,我每次都选择应用模板,它更灵活,只有在代码看起来更整洁或更容易理解的时候才会使用。