循环导致xsl-fo具有相同的节点

时间:2014-10-10 08:12:10

标签: xml xslt xsl-fo

我在使用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>

2 个答案:

答案 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>