xml和xsl无法循环

时间:2014-04-09 08:28:03

标签: xml xslt xsl-fo

我有一个XML:

<service>
     <row>
          <column>service1</column>
          <column>service2</column>
          <column>service3</column>
     </row>
</service>

我想将所有service1循环到service3。在XSL中我用过:

<xsl:for-each select="service/row">
    <fo:block>
         <xsl:value-of select="column" />
    </fo:block>
</xsl:for-each>

为什么它只会输出第一列“column1”?你如何从service1循环到service3?我只是按照w3schools中的教程,但不能使用此示例进行复制。我错过了什么?我只是XSL和XML的新手。

2 个答案:

答案 0 :(得分:1)

考虑文件系统。您的for-each循环遍历row目录中的每个service目录,并打印该行column的值。每行有几列,但value-of只会给你第一列。您只有一行,因此您只能获得一列。

您要做的是遍历每个column中每个row的{​​{1}}个目录。然后打印当前“目录”的值,就像在Unix中一样,使用service符号获取。所以,像这样调整你的代码

.

它应该都可以正常工作!

答案 1 :(得分:1)

您只看到第一个值,因为<xsl:value-of>输出其参数的字符串值

一组节点的字符串值是第一个节点的文本内容 - 这就是节点集按定义转换为字符串的方式。

最重要的是,你做错了。


<xsl:for-each select="service/row">
  <fo:block>
    <xsl:for-each select="column" />
      <fo:block>
        <xsl:value-of select="." />
      </fo:block>
    </xsl:for-each>
  </fo:block>
</xsl:for-each>

但实际上你不应该使用<xsl:for-each>来做那件事。使用模板匹配和<xsl:apply-templates>,例如:

<!-- <service> becomes a table -->
<xsl:for-each select="service">
  <fo:table>
    <xsl:apply-templates />
  </fo:table>
</xsl:for-each>

<!-- <row> becomes a table-row -->
<xsl:template match="service/row">
  <fo:table-row>
    <xsl:apply-templates />
  </fo:table-row>
</xsl:template>

<!-- <column> becomes a table-cell -->
<xsl:template match="service/row/column">
  <fo:table-cell>
    <xsl:value-of select="." />
  </fo:table-cell>
</xsl:template>