我有一个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的新手。
答案 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>