使用XSLT在表中显示两个列表

时间:2015-09-05 13:35:11

标签: html xml xslt

这是我的xml:

(t (will-throw-at-compile))

我想将它转换成usign xslt,最终的结果应该是:

<volume>
    <cap>title 1</cap>
    <cap>title 2</cap>
    <cap>title 3</cap>
    <cap>title 4</cap>
    <cap>title 5</cap>

    <desc>desc 1</desc>
    <desc>desc 2</desc>
    <desc>desc 3</desc>
    <desc>desc 4</desc>
    <desc>desc 5</desc>
</volume>

我试过这个xslt代码:

<table>
<tr>
<td>title 1</td>
<td>desc 1</td>
</tr>
<tr>
<td>title 2</td>
<td>desc 2</td>
</tr>
<tr>
...
</tr>

但它不起作用。当我在第n个上限时,获取第n desc的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

感谢您对问题的更新。

<xsl:value-of select="../desc[position()]"/>

您的想法是正确的,除了position()此处取desc的位置,即1,2,3等,具体取决于desc的位置(焦点在每个谓词测试)。像这样的测试总是正确的,因为如果谓词包含数值$X,它就是$X = position()的缩写。在这种情况下,您实际上是在写../desc[position() = position()],这总是正确的。

你想要的是cap的当前位置。要解决此问题,请使用变量,如下所示。

以下是我将如何使用XSLT的功能与模板匹配:

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

<xsl:attribute-set name="td1">
    <xsl:attribute name="style">border-top: dotted 1px; border-right:solid 1px; text-align:right; width:46%;</xsl:attribute>
</xsl:attribute-set>

<xsl:attribute-set name="td2">
    <xsl:attribute name="style">border-top: dotted 1px; text-align:right; :46%;</xsl:attribute>
</xsl:attribute-set>

<xsl:template match="/volume">
    <table style="border:solid 1px;  width:500px; margin:auto;">
        <xsl:apply-templates select="cap" />
    </table>
</xsl:template>

<xsl:template match="cap">
    <tr>
        <xsl:variable name="pos" select="position()" />
        <td xsl:use-attribute-sets="td1">
            <xsl:value-of select="." />
            <br />
        </td>
        <xsl:apply-templates select="../desc[$pos]" />
    </tr>
</xsl:template>

<xsl:template match="desc">
    <td xsl:use-attribute-sets="td2">
         <xsl:value-of select="." />
         <br />
    </td>
</xsl:template>

编辑:在您更新问题后,我添加了与style属性的交易,并附加了<tr>元素。现在结果是,给出您的输入:

<table style="border:solid 1px;  width:500px; margin:auto;">
  <tr>
    <td style="border-top: dotted 1px; border-right:solid 1px; text-align:right; width:46%;">title 1<br></td>
    <td style="border-top: dotted 1px; text-align:right; :46%;">desc 1<br></td>
  </tr>
  <tr>
    <td style="border-top: dotted 1px; border-right:solid 1px; text-align:right; width:46%;">title 2<br></td>
    <td style="border-top: dotted 1px; text-align:right; :46%;">desc 2<br></td>
  </tr>
  <tr>
    <td style="border-top: dotted 1px; border-right:solid 1px; text-align:right; width:46%;">title 3<br></td>
    <td style="border-top: dotted 1px; text-align:right; :46%;">desc 3<br></td>
  </tr>
  <tr>
    <td style="border-top: dotted 1px; border-right:solid 1px; text-align:right; width:46%;">title 4<br></td>
    <td style="border-top: dotted 1px; text-align:right; :46%;">desc 4<br></td>
  </tr>
  <tr>
    <td style="border-top: dotted 1px; border-right:solid 1px; text-align:right; width:46%;">title 5<br></td>
    <td style="border-top: dotted 1px; text-align:right; :46%;">desc 5<br></td>
  </tr>
</table>