xsl通过联接计数器字段创建两个表

时间:2016-09-13 14:44:22

标签: xml xslt

我有一个XML文档:

<Cable>A030.000  </Cable>
<Address>
<ZIP>11411</ZIP>
<City>A-City</City>
<Street>B-Street</Steet>
<Hause>8</Hause>
<CableData>
<Damping>0242</Damping>
<DM-1>400</DM-1>
<Length-1>0054</Length-1>
<DM-2>400</DM-2>
<Length-2>0041</Length-2>
<DM-3>400</DM-3>
<Length-3>0024</Length-3>
</CableData>
</Address>
<Address>
<ZIP>11511</ZIP>
<City>A-City</City>
<Street>B-Street</Steet>
<Hause>10</Hause>
<CableData>
<Damping>0242</Damping>
<DM-1>400</DM-1>
<Length-1>0054</Length-1>
</CableData>
</Address>

这里每个Address节点都有一个子节点CableData,它又具有Damping和最多5对DM-xx Length-xx。

我想要实现的是使用由公共字段行计数器连接的XSL 2表创建。第一个表应包含除CableData之外的地址信息,而另一个表应显示每个地址的CableData内容。表的公共数据位于第一列,即行号,用于连接两个表中的数据。

1-st表:

<table>
<tr>
<th>Num</th>
<th>Zip</th>
<th>City</th>
<th>City dstr</th>
<th>Street</th>
<th>Hause</th>
<th>Hause Ltr</th>
</tr>
<tr>
  <td>1</td>
  <td>12345</td>
  <td>A-City</td>
  <td>North</td>
  <td>B-Street</td>
  <td>1</td>
  <td>C</td>
 </tr>
 <tr>
  <td>2</td>
  <td>12345</td>
  <td>A-City</td>
  <td>North</td>
  <td>B-Street</td>
  <td>2</td>
  <td>D</td>
 </tr>  
 </table>

2-nd table

<table>
<tr>
  <th>Num</th>
  <th>Damping</th>
  <th>DM-1</th>
<th>Length-1</th>
<th>DM-2</th>
<th>Length-2</th>
<th>DM-3</th>
<th>Length-3</th>
<th>DM-4</th>
<th>Length-4</th>
<th>DM-5</th>
<th>Length-5</th>
</tr>
<tr>
<td>1</td>
<td>0242</td>
<td>400</td>
<td>0054</td>
<td>400</td>
<td>0041</td>
<td>400</td>
<td>0024</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>2</td>
<td>0242</td>
<td>400</td>
<td>0054</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>  
</table>

两个表中的公共列是Num。

1 个答案:

答案 0 :(得分:0)

提示1:请提供完整且格式正确的文档,例如评论中已提及的@ michael.hor257k等Minimal,Complete和Verifiable示例。

提示2:请验证您的给定xml。这些都无效。 [例如:<street>已被</steet>]

关闭

提示3:告诉我们问题出在哪里。如果您只是搜索某人,谁来完成您的工作,那么这是一个错误的地方。记住这一点。

看看:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output encoding="UTF-8" method="html"/>

    <xsl:template match="/">
        <xsl:call-template name="createAddressesTab"/>
        <xsl:call-template name="createDampingTab"/>
    </xsl:template>

    <xsl:template name="createAddressesTab">
        <table>
            <tr>
                <th>Num</th>
                <th>Zip</th>
                <th>City</th>
                <th>City dstr</th>
                <th>Street</th>
                <th>Hause</th>
                <th>Hause Ltr</th>
            </tr>
            <xsl:for-each select="//Address">
                <tr>
                    <td><xsl:value-of select="position()"/></td>
                    <td><xsl:value-of select="ZIP"/></td>
                    <td><xsl:value-of select="City"/></td>
                    <td><!-- provide some xml for this tag --></td>
                    <td><xsl:value-of select="Street"/></td>
                    <td><xsl:value-of select="Hause"/></td>
                    <td><!-- provide some xml for this tag --></td>
                </tr>
            </xsl:for-each>
        </table>
    </xsl:template>

    <xsl:template name="createDampingTab">
        <table>
            <tr>
                <th>Num</th>
                <th>Damping</th>
                <th>DM-1</th>
                <th>Length-1</th>
                <th>DM-2</th>
                <th>Length-2</th>
                <th>DM-3</th>
                <th>Length-3</th>
                <th>DM-4</th>
                <th>Length-4</th>
                <th>DM-5</th>
                <th>Length-5</th>
            </tr>
            <xsl:for-each select="//Address">
                <tr>
                    <td><xsl:value-of select="position()"/></td>
                    <td><xsl:value-of select="CableData/Damping"/></td>
                    <td><xsl:value-of select="CableData/DM-1"/></td>
                    <td><xsl:value-of select="CableData/Length-1"/></td>
                    <td><xsl:value-of select="CableData/DM-2"/></td>
                    <td><xsl:value-of select="CableData/Length-2"/></td>
                    <td><xsl:value-of select="CableData/DM-3"/></td>
                    <td><xsl:value-of select="CableData/Length-3"/></td>
                    <td><xsl:value-of select="CableData/DM-4"/></td>
                    <td><xsl:value-of select="CableData/Length-4"/></td>
                    <td><xsl:value-of select="CableData/DM-5"/></td>
                    <td><xsl:value-of select="CableData/Length-5"/></td>
                </tr>
            </xsl:for-each>
        </table>
    </xsl:template>

</xsl:stylesheet>

<强>说明: 非常直接的#34;高级&#34;一。它在XSLT 1.0中完全正常运行。调用执行所请求工作的2个命名模板。

它完成了工作。如果有任何问题,请通过评论询问。 如果您愿意,请提出并/或关闭此问题