xml和xsl不能循环

xml和xsl不能循环,xml,xslt,xsl-fo,Xml,Xslt,Xsl Fo,我有一个XML: <service> <row> <column>service1</column> <column>service2</column> <column>service3</column> </row> </service> 服务1 服务2 服务3 我想将所有服务1循环到服务3

我有一个XML:

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

服务1
服务2
服务3
我想将所有服务1循环到服务3。在XSL中,我使用了:

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


为什么它只输出第一列,即“column1”?如何从服务1循环到服务3?我只是在w3schools学习了教程,但无法使用此示例进行复制。我错过了什么?我刚刚接触XSL和XML。

从文件系统的角度考虑。您的
for each
循环正在
服务
目录中的每个
目录上循环,并打印该行的
的值。每行有几列,但
值只会给出第一列。您只有一行,因此只能得到一列

您要做的是在每个
服务的每个
行中的每个
目录上循环。然后打印当前“目录”的值,与Unix中一样,该值是使用
符号获得的。所以,像这样调整代码

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


这一切都应该很好

您只看到第一个值,因为
输出其参数的字符串值

一组节点的字符串值是第一个节点的文本内容-这就是节点集如何根据定义转换为字符串

底线是,你做错了



但事实上,你不应该用
来处理那些不必要的事情。使用模板匹配和
,例如:

<!-- <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>

<!-- <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>