2016-08-15 142 views
0

我想将XML转换为可读的HTML。下面我将我的XML的示例部分放在一边,我无法改变自己,需要一些帮助。 XML可能具有可变数量的列,这些列将由名称col1,col2 --- colxxx生成。这里如果ITEM =标签我在他们的名字前加 我想把所有的<nonLog>记录放在一张表中,而所有的<log>记录都是明智的。 这意味着 我们将有 非日志的形式1个 日志表单1 非日志形式2 然后日志从2 ..等等等等第四使用XSLT将动态XML转换为多个HTML表格

<Post> 
     <FormData> 
     <SUBJECT>94</SUBJECT> 
     <FORM_OID>TOX</FORM_OID> 
     <NonLog> 
      <ID>1</ID> 
      <SUBJECT_ID>94</SUBJECT_ID> 
      <FORM_OID>TOX</FORM_OID> 
      <ITEM>Label</ITEM> 
      <col1>Visit</col1> 
      <col2> AV</col2> 
      <col3>AC</col3> 
     </NonLog> 
     <NonLog> 
      <ID>2</ID> 
      <SUBJECT_ID>94</SUBJECT_ID> 
      <FORM_OID>TOX</FORM_OID> 
      <ITEM>Data</ITEM> 
      <col1>1t</col1> 
      <col2>No</col2> 
      <col3></col3> 
     </NonLog> 
     <Log> 
      <ID>5</ID> 
      <SUBJECT_ID>94</SUBJECT_ID> 
      <FORM_OID>TOX</FORM_OID> 
      <ITEM>Label</ITEM> 
      <LOG_REC_POSITION>1</LOG_REC_POSITION> 
      <col1>Pat Name</col1> 
      <col2>Doc Name</col2> 
     </Log> 
     <Log> 
      <ID>5</ID> 
      <SUBJECT_ID>94</SUBJECT_ID> 
      <FORM_OID>TOX</FORM_OID> 
      <ITEM>Label</ITEM> 
      <LOG_REC_POSITION>1</LOG_REC_POSITION> 
      <col1>Sam</col1> 
      <col2>Dr Mike</col2> 
     </Log> 
    </Form Data> 
    <FormData> 
     <SUBJECT>94</SUBJECT> 
     <FORM_OID>TOX2</FORM_OID> 
     <NonLog> 
      <ID>1</ID> 
      <SUBJECT_ID>94</SUBJECT_ID> 
      <FORM_OID>TOX2</FORM_OID> 
      <ITEM>Label</ITEM> 
      <col1>Visit</col1> 
      <col2> AV</col2> 
      <col3>AC</col3> 
     </NonLog> 
     <NonLog> 
      <ID>2</ID> 
      <SUBJECT_ID>94</SUBJECT_ID> 
      <FORM_OID>TOX2</FORM_OID> 
      <ITEM>Data</ITEM> 
      <col1>1t</col1> 
      <col2>No</col2> 
      <col3></col3> 
     </NonLog> 
     <Log> 
      <ID>5</ID> 
      <SUBJECT_ID>94</SUBJECT_ID> 
      <FORM_OID>TOX2</FORM_OID> 
      <ITEM>Label</ITEM> 
      <LOG_REC_POSITION>1</LOG_REC_POSITION> 
      <col1>Pat Name</col1> 
      <col2>Doc Name</col2> 
     </Log> 
     <Log> 
      <ID>5</ID> 
      <SUBJECT_ID>94</SUBJECT_ID> 
      <FORM_OID>TOX2</FORM_OID> 
      <ITEM>Label</ITEM> 
      <LOG_REC_POSITION>1</LOG_REC_POSITION> 
      <col1>Sam</col1> 
      <col2>Dr Mike</col2> 
     </Log> 
    </Form Data> 
    </Post> 

预期的HTML输出是

<Table> 
    <tr><td> 
    <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> 
    </table>  
    </td></tr> 
    <table> 
     <tr><td><b>Pat Name</b></td><td><b>Doc Name</b></td></tr> 
     <tr><td>Sam Hul</td><td>Dr Mike</td></tr> 
    </table><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> 
    </table>  
    </td></tr> 
    <table> 
     <tr><td><b>Pat Name</b></td><td><b>Doc Name</b></td></tr> 
     <tr><td>Sam Hul</td><td>Dr Mike</td></tr> 
    </table> 

</table> 
+0

您可以使用XSLT 2.0吗? –

+0

可能是的..会有更多的帮助。 –

+0

是的。这基本上是一个分组问题,而XSLT 2.0具有分组功能。 –

回答

1

有可能,有可能是这样的形式多个标签。但是 整个表单是Log或Non_log类型。所以我们只需要一个表格中的两个 表。

如果是这样,您可以简单地对两个表进行硬编码。

试着这么做:

XSLT 1.0

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

<xsl:template match="/Post"> 
    <html> 
     <body> 
      <table> 
       <tr> 
        <xsl:apply-templates select="FormData/NonLog[1]" mode="header"/> 
       </tr> 
       <xsl:apply-templates select="FormData/NonLog[position() > 1]" /> 
      </table>  
      <table> 
       <tr> 
        <xsl:apply-templates select="FormData/Log[1]" mode="header"/> 
       </tr> 
       <xsl:apply-templates select="FormData/Log[position() > 1]" /> 
      </table>  
     </body> 
    </html> 
</xsl:template> 

<xsl:template match="FormData/*" mode="header"> 
    <xsl:for-each select="*[starts-with(name(), 'col')]"> 
     <th> 
      <xsl:value-of select="."/> 
     </th> 
    </xsl:for-each> 
</xsl:template> 

<xsl:template match="FormData/*"> 
    <tr> 
     <xsl:for-each select="*[starts-with(name(), 'col')]"> 
      <td> 
       <xsl:value-of select="."/> 
      </td> 
     </xsl:for-each> 
    </tr> 
</xsl:template> 

</xsl:stylesheet> 
+0

我可以看到格式化的数据。但有一个问题。 XML中有多种形式。非日志中的所有数据都聚合在一起。这不应该发生。 –

+0

不知道是什么问题。在你的问题中,你说:“*我想把所有的记录放在一张表中,而所有的记录都放在另一张表中。”“ –

+0

我已经更新了这个问题。每个XML中都有多个表单标签。我想为每个表单日志和非日志条目创建一个单独的表。这意味着如果有两种形式,则会创建4个表格。两种表格在每种形式。 –