首页 > 解决方案 > 如何使用 XSL 1.0 在重复上下文中显示当前日期?

问题描述

我正在尝试在重复上下文中显示当前日期,其中我的元素位于重复上下文之外。

示例 XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <AllLines>
        <Versions>
            <field1>V1.0</field1>
            <field2>A1.0</field2>
        </Versions>
        <Versions>
            <field1>V2.0</field1>
            <field2>A2.0</field2>
        </Versions>
        <Versions>
            <field1>V3.0</field1>
            <field2>A3.0</field2>
        </Versions>
        <Versions>
            <field1>V4.0</field1>
            <field2>A4.0</field2>
        </Versions>
        <Versions>
            <field1>V5.0</field1>
            <field2>A5.0</field2>
        </Versions>
    </AllLines>
    <CurrentLines>
        <CurrentLine date="21 Aug">
            <field1>X1.0</field1>
            <field2>Y1.0</field2>
            <field3>Y1.0</field3>
        </CurrentLine>
        <CurrentLine date="30 Jan">
            <field1>X2.0</field1>
            <field2>Y2.0</field2>
            <field3>Y2.0</field3>
        </CurrentLine>
        <CurrentLine date="02 Feb">
            <field1>X3.0</field1>
            <field2>Y3.0</field2>
            <field3>Y3.0</field3>
        </CurrentLine>
        <CurrentLine date="21 Aug">
            <field1>X4.0</field1>
            <field2>Y4.0</field2>
            <field3>Y4.0</field3>
        </CurrentLine>
        <CurrentLine date="03 Jan">
            <field1>X5.0</field1>
            <field2>Y5.0</field2>
            <field3>Y5.0</field3>
        </CurrentLine>
    </CurrentLines>
</root>

我的示例模板将如下所示:

<xsl:template name="displayDate">
    <fo:block>
        <xsl:for-each select="/root/AllLines/Versions">
            <fo:block>
                <xsl:value-of select="field1" />
            </fo:block>
            <fo:block>
                <xsl:value-of select="field2" />
            </fo:block>
            <fo:block border-bottom="1pt solid black" margin-bottom="4pt">
                <xsl:value-of select="/root/CurrentLines/CurrentLine[current()]/@date" />
            </fo:block>
        </xsl:for-each>
    </fo:block>
</xsl:template>

使用上面的模板,我正在生成以下输出:

V1.0
A1.0
21 Aug
--------
V2.0
A2.0
21 Aug
-------
V3.0
A3.0
21 Aug
------
V4.0
A4.0
21 Aug
------
V5.0
A5.0
21 Aug

每个重复组中的第三个元素总是会显示第一个日期属性,来自/root/CurrentLines/CurrentLine

预期结果将是:

V1.0
A1.0
21 Aug
--------
V2.0
A2.0
30 Jan
-------
V3.0
A3.0
02 Feb
------
V4.0
A4.0
21 Aug
------
V5.0
A5.0
03 Jan

有什么办法我仍然可以在Versions显示当前字段之后继续重复,但是@date根据相应的当前CurrentLine元素显示当前属性?

谢谢!

标签: xsltxslt-1.0repeat

解决方案


尝试:

<xsl:for-each select="/root/AllLines/Versions">
    <xsl:variable name="i" select="position()" />
    <fo:block>
        <xsl:value-of select="field1" />
    </fo:block>
    <fo:block>
        <xsl:value-of select="field2" />
    </fo:block>
    <fo:block border-bottom="1pt solid black" margin-bottom="4pt">
        <xsl:value-of select="/root/CurrentLines/CurrentLine[$i]/@date" />
    </fo:block>
</xsl:for-each>

推荐阅读