XSLT - 每个子节点的循环(不同的节点大小)

时间:2015-09-13 01:01:21

标签: xml xslt for-loop

我试图展示章节&在某些圣经经文中找到的专有名词的入口。与编辑HTML文件相比,这将大大节省我的时间。这就是我开始使用XML的原因。

我已经到了每次出现循环正确次数的程度,但是我无法正确地列出XML数据。

对于pn_book / pn_chptr / token_occurrence的DOM元素,我有诗歌和音符的元素。 verse_path用于创建指向相应网页文件的链接。

这是一个章节数据文件的示例&用于呈现页面的XSLT代码:

<pn_book>
<pn_chptr>
    <bookname>2 John </bookname> 
    <chptr>1</chptr>
    <token_occurrence>
        <pn_token>Christ</pn_token>
        <verse_path>2JO1.HTM#3</verse_path>
        <verse>3</verse>
        <verse_path>2JO1.HTM#7</verse_path>
        <verse>7</verse>
        <verse_path>2JO1.HTM#9</verse_path>
        <verse>9</verse>
    </token_occurrence>

<xsl:for-each select="pn_book/pn_chptr">
    <h2><xsl:value-of select="bookname"/> Chapter <xsl:value-of select="chptr"/></h2>
    <xsl:for-each select="token_occurrence">
        <xsl:value-of select="pn_token" /> - <xsl:value-of select="../bookname"/> 
        <xsl:for-each select="verse">
            <a href="{verse_path}"><xsl:value-of select="../../chptr" />:<xsl:value-of select="../verse" /></a>; 
        </xsl:for-each><br />
    </xsl:for-each>
</xsl:for-each>

结果仅显示第一个条目而不是每个条目。 我想我需要某种计数器来在verse()&amp;中显示正确的数组元素。 verse_path()数组。

我试图使用XSLT而不仅仅是JavaScript。 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

以这种方式试试吗?

...
<xsl:for-each select="verse">
    <a href="{preceding-sibling::verse_path[1]}"><xsl:value-of select="../../chptr" />:<xsl:value-of select="." /></a>; 
</xsl:for-each>
...

或者可能更有效率:

<xsl:template match="pn_book">
    <xsl:for-each select="pn_chptr">
        <xsl:variable name="bookname" select="bookname" />
        <xsl:variable name="chptr" select="chptr" />
        <h2><xsl:value-of select="$bookname"/> Chapter <xsl:value-of select="$chptr"/></h2>
        <xsl:for-each select="token_occurrence">
            <xsl:value-of select="pn_token" /> - <xsl:value-of select="$bookname"/> 
            <xsl:for-each select="verse">
                <a href="{preceding-sibling::verse_path[1]}"><xsl:value-of select="$chptr" />:<xsl:value-of select="." /></a>; 
            </xsl:for-each>
            <br/>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>