在html列表中转换xml结构的通用xslt

时间:2016-09-26 13:31:37

标签: xml xslt transformation

我需要一个将xml转换为html列表的通用xslt。

示例xml片段:

<person>
  <firstname>A</firstname>
  <lastname>B</lastname>
  <address>
   <city>C</city>
   <street>S</street>
  </address>
</person>

输出应为

<ul>
    <li>person
        <ul>
            <li>firstname: A</li>
            <li>lastname: B</li>
            <li>address
            <ul>
                <li>city: C</li>
                <li>street: S</li>
            </ul>
        </ul>
    </li>
</ul>

源xml在运行时生成,并不总是具有此结构。因此标签名称可以不同。因此,xslt必须是通用的。

2 个答案:

答案 0 :(得分:1)

尝试类似:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

    <xsl:template match="/">
        <ul>
            <xsl:apply-templates select="*"/>
        </ul>
    </xsl:template>

    <xsl:template match="*[*]"> 
        <li>
            <xsl:value-of select="name()"/>
            <ul>
                <xsl:apply-templates select="*"/>
            </ul>
        </li>
    </xsl:template>

    <xsl:template match="*[not(*)]">
        <li>
            <xsl:value-of select="concat(name(), ': ', .)"/>
        </li>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

怎么样:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
    <ul>
        <xsl:apply-templates/>
    </ul>
</xsl:template>

<xsl:template match="*">
    <li>
        <xsl:value-of select="name()" />
        <xsl:if test="text()">
            <xsl:text>: </xsl:text>
            <xsl:apply-templates select="text()" />
        </xsl:if>
        <xsl:if test="*">
            <ul>
                <xsl:apply-templates/>
            </ul>
        </xsl:if>
    </li>
</xsl:template>

</xsl:stylesheet>