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

Xml 循环会导致xsl fo具有相同的节点,xml,xslt,xsl-fo,Xml,Xslt,Xsl Fo,使用xsl fo在循环中正确显示select值时遇到问题 正如您在xml中看到的,每个都有许多节点。我试图在fo:block标记中显示每个值,但目前它只在一个fo:block上显示所有值,这导致值在一行上挤压在一起,我无法理解 XSL: <xsl:template match="/"> <xsl:for-each select="company/staff"> <fo:block> <xsl:value-o

使用xsl fo在循环中正确显示select值时遇到问题

正如您在xml中看到的,每个
都有许多
节点。我试图在fo:block标记中显示每个
值,但目前它只在一个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>
<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>

XML:

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

地点1
地点2
地点3
地点4
...
地点1
...
...

您需要将当前输出
fo:block
的代码包装在
xsl:for each
中,以便它适用于每个单独的
访问的
节点,而不仅仅是第一个:

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

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