1

我是 xslt 的新手并且面临一个问题,因为我动态生成了一个 xml 文件(即节点名称未知)并尝试了许多方法来使用 xslt 查看 html 文件中嵌套表中的内容,但我所有的努力都失败了。

<?xml version="1.0" encoding="UTF-8"?>
<content>
    <Source>
        <Column1>Name</Column1>
        <Column2>Organization Name</Column2>
        <SubSource>
            <Column1>Name</Column1>
            <Column2>Person Name</Column2>
            <Column1>Address</Column1>
            <Column2>House: E5, Block-G, Road-02</Column2>
            <Details>
                <Column1>Entry date</Column1>
                <Column2>6/6/13 12:04 PM</Column2>
                <Column1>height</Column1>
                <Column2>153</Column2>
                <Column1>weight</Column1>
                <Column2>53.5</Column2>
                <Column1>temperature</Column1>
                <Column2>98.67</Column2>
                <Column1>pulse rate</Column1>
                <Column2>76</Column2>
                <Advices>
                    <Advice>
                        <Column1>Title</Column1>
                        <Column2>Workout</Column2>
                        <Column1>Location</Column1>
                        <Column2>In the Park</Column2>
                    </Advice>
                    <Advice>
                        <Column1>Title</Column1>
                        <Column2>Eating Habit</Column2>
                        <Column1>Remarks</Column1>
                        <Column2>Eat Less</Column2>
                        <Column1>Notes</Column1>
                        <Column2>Avoid salts</Column2>
                    </Advice>
                </Advices>
            </Details>
        </SubSource>
    </Source>
    <Source>
        <Column1>Name</Column1>
        <Column2>Organization Name</Column2>
        <SubSource>
            <Column1>Name</Column1>
            <Column2>Person Name</Column2>
            <Column1>Address</Column1>
            <Column2>House: E5, Block-G, Road-02</Column2>
            <Details>
                <Column1>Entry date</Column1>
                <Column2>6/6/13 12:04 PM</Column2>
                <Column1>height</Column1>
                <Column2>153</Column2>
                <Column1>weight</Column1>
                <Column2>53.5</Column2>
                <Column1>temperature</Column1>
                <Column2>98.67</Column2>
                <Column1>pulse rate</Column1>
                <Column2>76</Column2>
                <Advices>
                    <Advice>
                        <Column1>Title</Column1>
                        <Column2>Workout</Column2>
                        <Column1>Location</Column1>
                        <Column2>In the Park</Column2>
                    </Advice>
                </Advices>
            </Details>
        </SubSource>
    </Source>
</content>

我使用了一些 xslt 方法。然而,他们所有人都没有按需要查看数据,要么更少,要么格式不正确!!!

以下是我最好的方法(我没有进行多表设计,因为我想先获取所有数据)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/>
    <xsl:template match="/">
        <html>
            <body>
                <table>
                    <xsl:apply-templates select="content/Source"/>
                </table>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="content/Source">
        <xsl:variable name="column" select="content/Source"/>
        <tr>
            <td>
                <xsl:value-of select="Column1"/>
            </td>
            <td>
                <xsl:value-of select="Column2"/>
            </td>
        </tr>
        <xsl:apply-templates select="SubSource"/>
    </xsl:template>
    <xsl:template match="SubSource">
        <tr>
            <td>
                <xsl:value-of select="Column1"/>
            </td>
            <td>
                <xsl:value-of select="Column2"/>
            </td>
        </tr>
        <xsl:apply-templates select="Details"/>
    </xsl:template>
    <xsl:template match="Details">
        <tr>
            <td>
                <xsl:value-of select="Column1"/>
            </td>
            <td>
                <xsl:value-of select="Column2"/>
            </td>
        </tr>
        <xsl:apply-templates select="Advices"/>
    </xsl:template>
    <xsl:template match="Advices">
        <xsl:for-each select="Advice">
            <tr>
                <td>
                    <xsl:value-of select="Column1"/>
                </td>
                <td>
                    <xsl:value-of select="Column2"/>
                </td>
            </tr>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

输出是:

 <table>
         <tr>
            <td>Name</td>
            <td>Organization Name</td>
         </tr>
         <tr>
            <td>Name</td>
            <td>Person Name</td>
         </tr>
         <tr>
            <td>Entry date</td>
            <td>6/6/13 12:04 PM</td>
         </tr>
         <tr>
            <td>Title</td>
            <td>Workout</td>
         </tr>
         <tr>
            <td>Title</td>
            <td>Eating Habit</td>
         </tr>
         <tr>
            <td>Name</td>
            <td>Organization Name</td>
         </tr>
         <tr>
            <td>Name</td>
            <td>Person Name</td>
         </tr>
         <tr>
            <td>Entry date</td>
            <td>6/6/13 12:04 PM</td>
         </tr>
         <tr>
            <td>Title</td>
            <td>Workout</td>
         </tr>
      </table>

我的目标是获得与 XML 结构相同的表格布局。

始终欢迎有关更好的 XML 格式的建议!

谢谢

4

1 回答 1

0

这个 XSLT 1.0 样式表可以满足您的要求:它从未知元素名称的结构中创建嵌套的 HTML 表。

唯一的先决条件是,有些<Column1>元素可能后跟一个关联的<Column2>.

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

  <xsl:output method="html" indent="yes" />

  <!-- #1: anything that has <Column1> children becomes a table -->
  <xsl:template match="*[Column1]">
    <table class="{name()}">
      <xsl:apply-templates select="*" mode="nested" />
    </table>
  </xsl:template>

  <!-- #2: ...if it's nested, it is wrapped in a table row first -->
  <xsl:template match="*[Column1]" mode="nested">
    <tr>
      <td colspan="2">
        <!-- this actually executes #1 because it uses no mode! -->
        <xsl:apply-templates select="." />
      </td>
    </tr>
  </xsl:template>

  <!-- #3: <Column1> governs the creation of table rows -->
  <xsl:template match="*[Column1]/Column1" mode="nested">
    <tr>
      <td><xsl:value-of select="." /></td>
      <td><xsl:value-of select="following-sibling::*[1][self::Column2]" /></td>
    </tr>
  </xsl:template>

  <!-- #4: suppress any other data field (like <Column2>) -->
  <xsl:template match="*[Column1]/*[not(*)]" mode="nested" />

</xsl:stylesheet>

注意模板模式的使用:如果有多个模板可以匹配某个元素,您可以使用mode它们来区分它们。

在这种情况下,您要创建嵌套表。在根级别(默认情况),您可以简单地创建一个<table>元素。

但是,如果您已经在 a<table>中,则必须先创建<tr>/ <td>,但之后的过程是相同的。

通过使用模式,我可以确保在正确的上下文中执行正确的模板,而无需在创建实际的<table>.

作为副作用,通过使用模式,我们可以创建一整套模板,这些模板可以放入现有的样式表中,而不会影响已建立的工作流程。


following-sibling::*[1][self::Column2]“第一个跟随兄弟,但前提是它实际上是一个<Column2>.” .


模板 #4 是必要的,因为相当不具体的模板<xsl:apply-templates select="*" mode="nested" />也适用于<Column2>. 然而,这些实际上已经被#3 处理了,这意味着除非我们明确地抑制它们,否则它们会产生不需要的重复输出。

于 2014-06-25T10:16:18.493 回答