使用XSLT将动态XML转换为HTML

时间:2016-08-11 16:02:04

标签: xml xslt

我想将XML转换为可读的HTML。 下面我将放置我的XML样本部分,我无法改变自己并需要一些帮助。

XML可能具有可变数量的列,这些列将由名称col1,col2---colxxx生成。这里如果ITEM = Label我在名字之前添加<B>

示例XML如下

<Root>
    <row ID="1" ITEM="Label" col1="visit no">
    <row ID="1" ITEM="Data" col1="1">
    <row ID="1" ITEM="Label" col1="Date">
    <row ID="1" ITEM="Data" col1="8/11/2018">
    <row ID="1" ITEM="Label" col1="PatName" col2="DocName" col3="DocName" />
    <row ID="2" ITEM="Data"  col1="Sam Hul" col2="Dr Mike" col3="Vegas Hospital"/>
    <row ID="2" ITEM="Data"  col1="Dan Brown" col2="Dr Matt" col3="California Hospital"/>

我想将上述XML转换为以下HTML内容。使用循环生成col1,col2,col3。所以他们的名字将在col之后有一个增量数字。

预期的输出HTML是

   <Table>
    <tr><td><b>visit no</b></td></tr>
    <tr><td>1</td></tr>
    <tr><td><b>Date</b></td></tr>
    <tr><td>8/11/2018</td></tr>
    <tr><td><b>PatName</b></td><td><b>DocName</b></td><td><b>DocName</b></td></tr>
    <tr><td>Sam Hul</td><td>Dr Mike</td><td>Vegas Hospital</td></tr>
    <tr><td>Dan Brown</td><td>Dr Matt</td><td>California Hospital</td></tr>
</table>

这就是我现在正在尝试的。它产生单个TR

<tr>
        <xsl:for-each select="row/@*">
                    <td><xsl:value-of select="."/></td>
        </xsl:for-each>
    </tr>

1 个答案:

答案 0 :(得分:1)

---为响应变更要求而编辑---

这是一种建立桌子的奇怪方式,但如果这是你想要的,请尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/Root">
    <table border="1">
        <xsl:for-each select="row">
            <tr>
                <xsl:apply-templates select="@*[starts-with(name(), 'col')]"/>
            </tr>
        </xsl:for-each>
    </table>
</xsl:template> 

<xsl:template match="@*[../@ITEM='Label']">
    <th>
        <xsl:value-of select="."/>
    </th>
</xsl:template> 

<xsl:template match="@*">
    <td>
        <xsl:value-of select="."/>
    </td>
</xsl:template> 

</xsl:stylesheet>

应用于格式正确(!) XML输入:

<强> XML

<Root>
    <row ID="1" ITEM="Label" col1="visit no"/>
    <row ID="1" ITEM="Data" col1="1"/>
    <row ID="1" ITEM="Label" col1="Date"/>
    <row ID="1" ITEM="Data" col1="8/11/2018"/>
    <row ID="1" ITEM="Label" col1="PatName" col2="DocName" col3="DocName" />
    <row ID="2" ITEM="Data"  col1="Sam Hul" col2="Dr Mike" col3="Vegas Hospital"/>
    <row ID="2" ITEM="Data"  col1="Dan Brown" col2="Dr Matt" col3="California Hospital"/>
</Root>

(渲染)结果将是:

enter image description here