我在使用xsl-fo。
在循环中正确显示选择值时遇到问题正如您在xml中看到的,每个<visited>
都有许多<firstname>
个节点。我试图在fo:block标签中显示每个<visited>
值,但此刻它只是在一个fo:block上显示它们,这导致值在一条线上压在一起而且我可以'弄明白了。
XSL:
<xsl:template match="/">
<xsl:for-each select="company/staff">
<fo:block>
<xsl:value-of select="@id" />
</fo:block>
<xsl:for-each select="firstname">
<fo:block>
<xsl:value-of select="@name" />
</fo:block>
<fo:block>
<xsl:value-of select="." />
</fo:block>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
XML:
<company>
<staff id="1">
<firstname name="name_1">
<visited>location_1</visited>
<visited>location_2</visited>
<visited>location_3</visited>
<visited>location_4</visited>
...
</firstname>
<firstname name="name_2">
<visited>location_1</visited>
...
</firstname>
</staff>
<staff id="2">
...
</staff>
</company>
答案 0 :(得分:1)
您需要将当前输出fo:block
的代码包装在xsl:for-each
中,以便它适用于每个单独的visited
节点,而不仅仅是第一个节点:
<xsl:for-each select="firstname">
<fo:block>
<xsl:value-of select="@name" />
</fo:block>
<xsl:for-each select="visited">
<fo:block>
<xsl:value-of select="." />
</fo:block>
</xsl:for-each>
</xsl:for-each>
答案 1 :(得分:1)
让XSLT处理器为您完成工作,并且对未来可能的XML更改更具弹性:
<xsl:strip-space elements="*"/>
<xsl:template match="staff">
<fo:block>
<xsl:value-of select="@id" />
</fo:block>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="firstname">
<fo:block>
<xsl:value-of select="@name" />
</fo:block>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="visited">
<fo:block>
<xsl:value-of select="." />
</fo:block>
</xsl:template>