当前位置: 首页 > 知识库问答 >
问题:

将XML文本转换为表

陆子航
2023-03-14

在下面的示例中,我们试图将XML数据转换为HTML

输入XML:

<?xml version="1.0" encoding="UTF-8"?>
<NM_TORP_TABLE>
<NM_TORP_TABLE_LIST>
    <NM_TORP_LABEL>Nr.</NM_TORP_LABEL>
    <NM_TORPCOLUMN_DATA>1 <BR/>2 <BR/>3 <BR/>4 <BR/>5 <BR/>6 <BR/>7 <BR/>8 <BR/>9 
        <BR/>10<BR/>11<BR/>12<BR/>13<BR/>14<BR/>15<BR/>16</NM_TORPCOLUMN_DATA>
</NM_TORP_TABLE_LIST>
<NM_TORP_TABLE_LIST>
    <NM_TORP_LABEL>Latitude</NM_TORP_LABEL>
    <NM_TORPCOLUMN_DATA>5° 10’ 6" S<BR/>3° 31’ 8" S<BR/>5° 19’ 7" S<BR/>3° 1’ 2" S <BR/>3° 9’ 6" S 
        <BR/>3° 20’ 9" S<BR/>5° 8’ 3" S <BR/>3° 55’ 9" S<BR/>4° 49’ 3" S<BR/>4° 49’ 8" S<BR/>3° 23’ 9" S<BR/>4° 12’ 3" S<BR/>4° 15’ 3" S<BR/>4° 54’ 0" S<BR/>3° 39’ 9" S<BR/>5° 20’ 3" S</NM_TORPCOLUMN_DATA>
</NM_TORP_TABLE_LIST>
<NM_TORP_TABLE_LIST>
    <NM_TORP_LABEL>Longitude</NM_TORP_LABEL>
    <NM_TORPCOLUMN_DATA>107° 38’ 5" E<BR/>110° 4’ 4" E<BR/>109° 5’ 8" E<BR/>109° 50’ 2" E<BR/>109° 47’ 4" E<BR/>108° 46’ 9" E<BR/>109° 52’ 4" E<BR/>107° 47’ 6" E<BR/>107° 42’ 3" E<BR/>107° 42’ 2" E<BR/>111° 35’ 24" E<BR/>111° 32’ 1" E<BR/>110° 43’ 5" E<BR/>110° 46’ 2" E<BR/>108° 32’ 9" E<BR/>109° 11’ 3" E</NM_TORPCOLUMN_DATA>
</NM_TORP_TABLE_LIST>
</NM_TORP_TABLE>

预期输出:

<table>
<tr>
    <td>Nr.</td>
    <td>Latitude</td>
    <td>Longitude</td>
</tr>
<tr>
    <td>1</td>
    <td>5° 10’ 6" S</td>
    <td>107° 38’ 5" E</td>
</tr>
<tr>
    <td>2</td>
    <td>3° 31’ 8" S</td>
    <td>110° 4’ 4" E</td>
</tr>
<tr>
    <td>3</td>
    <td>5° 19’ 7" S</td>
    <td>109° 5’ 8" E</td>
</tr>
.......    
</table>

XSLT代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
    <table>
        <tbody>
            <xsl:for-each select="NM_TORP_TABLE/NM_TORP_TABLE_LIST">
                <tr>
                    <td><xsl:value-of select="NM_TORP_LABEL"/></td>
                    <td><xsl:value-of select="NM_TORPCOLUMN_DATA"/></td>
                </tr>
            </xsl:for-each>
        </tbody>
    </table>
</xsl:template>
</xsl:stylesheet>

参考URL#https://xsltfiddle.liberty-development.net/nb9PtDU/1


共有1个答案

丁豪
2023-03-14

您的尝试完全忽略了输入XML的(次优)结构。您需要为第一个NM\u TORPCOLUMN\u数据元素内的每个文本节点创建一行,并从所有NM\u TORPCOLUMN\u数据元素中的相应文本节点填充其单元格。

这当然是假设所有NM_TORPCOLUMN_DATA元素具有完全相同数量的文本节点-否则我看不出这个任务是如何实现的。

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:template match="/NM_TORP_TABLE">
    <xsl:variable name="cols" select="NM_TORP_TABLE_LIST" />
    <table border="1">
        <!-- header -->
        <tr>
            <xsl:for-each select="$cols">
                <th>
                    <xsl:value-of select="NM_TORP_LABEL"/>
                </th>
            </xsl:for-each>
        </tr>
        <!-- data -->
        <xsl:for-each select="$cols[1]/NM_TORPCOLUMN_DATA/text()">
            <xsl:variable name="row" select="position()" />
            <tr>
                <xsl:for-each select="$cols">
                    <td>
                        <xsl:value-of select="NM_TORPCOLUMN_DATA/text()[$row]"/>
                    </td>
                </xsl:for-each>
            </tr>
        </xsl:for-each> 
    </table>
</xsl:template>

</xsl:stylesheet>

应用于您的输入示例,这将产生:

结果

<?xml version="1.0" encoding="UTF-8"?>
<table>
  <tr>
    <th>Nr.</th>
    <th>Latitude</th>
    <th>Longitude</th>
  </tr>
  <tr>
    <td>1 </td>
    <td>5° 10’ 6" S</td>
    <td>107° 38’ 5" E</td>
  </tr>
  <tr>
    <td>2 </td>
    <td>3° 31’ 8" S</td>
    <td>110° 4’ 4" E</td>
  </tr>
  <tr>
    <td>3 </td>
    <td>5° 19’ 7" S</td>
    <td>109° 5’ 8" E</td>
  </tr>
  <tr>
    <td>4 </td>
    <td>3° 1’ 2" S </td>
    <td>109° 50’ 2" E</td>
  </tr>
  <tr>
    <td>5 </td>
    <td>3° 9’ 6" S 
        </td>
    <td>109° 47’ 4" E</td>
  </tr>
  <tr>
    <td>6 </td>
    <td>3° 20’ 9" S</td>
    <td>108° 46’ 9" E</td>
  </tr>
  <tr>
    <td>7 </td>
    <td>5° 8’ 3" S </td>
    <td>109° 52’ 4" E</td>
  </tr>
  <tr>
    <td>8 </td>
    <td>3° 55’ 9" S</td>
    <td>107° 47’ 6" E</td>
  </tr>
  <tr>
    <td>9 
        </td>
    <td>4° 49’ 3" S</td>
    <td>107° 42’ 3" E</td>
  </tr>
  <tr>
    <td>10</td>
    <td>4° 49’ 8" S</td>
    <td>107° 42’ 2" E</td>
  </tr>
  <tr>
    <td>11</td>
    <td>3° 23’ 9" S</td>
    <td>111° 35’ 24" E</td>
  </tr>
  <tr>
    <td>12</td>
    <td>4° 12’ 3" S</td>
    <td>111° 32’ 1" E</td>
  </tr>
  <tr>
    <td>13</td>
    <td>4° 15’ 3" S</td>
    <td>110° 43’ 5" E</td>
  </tr>
  <tr>
    <td>14</td>
    <td>4° 54’ 0" S</td>
    <td>110° 46’ 2" E</td>
  </tr>
  <tr>
    <td>15</td>
    <td>3° 39’ 9" S</td>
    <td>108° 32’ 9" E</td>
  </tr>
  <tr>
    <td>16</td>
    <td>5° 20’ 3" S</td>
    <td>109° 11’ 3" E</td>
  </tr>
</table>

提供

 类似资料:
  • 我有一堆XML文档(源),需要将它们转换为具有不同结构(目标)的POJO。我的第一个明显的想法是使用JAXB和XSLT的组合。然而,在一些问题上,我不确定这是否合适。 我无法访问源的XSD。 我不需要目标作为XML结构,而只需要作为POJOs。 然后我想创建一个映射表,比如。 然而,这将导致大量“映射”代码,特别是在涉及复杂数据类型的情况下。 你对我如何实施这一点有什么建议吗?

  • XML输入文件: XML输入文件转换为XML输出文件。将XML输入文件的firstName、middleName和lastName标签合并为XML Ouput文件的name标签,将XML输入文件的address1、address2、city、state和pincode标签合并为XML Ouput文件的address标签。 我几乎转换了代码,但我在这里与empId作斗争。我已经在XSLT文件中手动输

  • 问题内容: 我有大量文本字符串,这些字符串显然是PDF文件的原始数据,我需要将其重新制作为PDF。 目前,我正在将字符串读取到StringBuffer中,但是如果需要,可以更改它。从那里,我尝试将其写到文件中并更改扩展名(我真的希望这样做能起作用,但是我有点不知道),我尝试将其带入String,然后从中取出byte []。并将其写入文件,或使用DataOutputStream将字节放入文件中。这些

  • 问题内容: 我有一些需要用XML迷惑的HTML文件。我们正在使用这些HTML为应用程序提供内容,但是现在我们必须以XML形式提供这些内容。 HTML文件包含,表格,div,图像,p,b或强标签等。 我用谷歌搜索并找到了一些应用程序,但是我还无法实现。 您能否建议一种将这些文件内容转换为XML的方法? 问题答案: 我成功使用了命令行实用程序。在Linux上,我使用迅速安装了它。然后命令: 给了一个x

  • 问题内容: 我试图将JSON输出转换为XML。不幸的是我得到这个错误: JSON根对象具有多个属性。根对象必须具有单个属性才能创建有效的XML文档。考虑指定DeserializeRootElementName。 这就是我到目前为止所创建的。 这是我的JSON输出: 我怎么解决这个问题? 问题答案: 尽管问题中提供的JSON并不完整,但您在顶层具有多个属性,如异常所示。您必须为其定义根以获取有效的X

  • 问题内容: 我只想知道在Java或C#中是否有任何库或外部库中的构建允许我获取音频文件并对其进行解析并从中提取文本。 我需要创建一个应用程序,但是我不知道从哪里开始。 问题答案: 以下是您的一些选择: 微软演讲 光明 龙自然讲 狮身人面像4