我有以下XML文件。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<toc-item>
<toc-title>A</toc-title>
<page>11/4/10A</page>
<page>cclxxi</page>
</toc-item>
<toc-item>
<toc-title>B</toc-title>
<page>11/5/1A</page>
</toc-item>
<toc-item>
<toc-title>C</toc-title>
<page>11/4</page>
<page>cclxxii</page>
</toc-item>
<toc-item>
<toc-title>B</toc-title>
<page>11/5/1A</page>
</toc-item>
<toc-item>
<toc-title>C</toc-title>
<page>11/4</page>
<page>cclxxiiv</page>
</toc-item>
</root>
以及XSLT以下。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<xsl:apply-templates></xsl:apply-templates>
</xsl:template>
<xsl:template match="root">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="toc-item">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="toc-title">
<td class="toc-title">
<xsl:apply-templates/>
</td>
</xsl:template>
<xsl:template match="content-style">
<xsl:variable name="fontStyle">
<xsl:value-of select="concat('font-style-',@font-style)"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="./@font-style">
<span class="{$fontStyle}">
<xsl:apply-templates/>
</span>
</xsl:when>
<xsl:otherwise>
<span class="{concat('format-',./@format)}">
<xsl:apply-templates/>
</span>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="page">
<xsl:choose>
<xsl:when test="not(preceding-sibling::page[1])">
<td class="toc-page" valign="bottom">
<xsl:value-of select="."/>
</td>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="." mode="first"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="page" mode="first">
<xsl:variable name="pgn">
<xsl:value-of select="./following::page/following-sibling::page[1]"/>
</xsl:variable>
<xsl:processing-instruction name="pb">
<xsl:text>label='</xsl:text>
<xsl:value-of select="$pgn"/>
<xsl:text>'</xsl:text>
<xsl:text>?</xsl:text>
</xsl:processing-instruction>
<a name="{concat('pg_',$pgn)}"/>
</xsl:template>
<xsl:template match="page" mode="two">
<xsl:processing-instruction name="pb">
<xsl:text>label='</xsl:text>
<xsl:value-of select="."/>
<xsl:text>'</xsl:text>
<xsl:text>?</xsl:text>
</xsl:processing-instruction>
<a name="{concat('pg_',.)}"/>
</xsl:template>
</xsl:transform>
这里我正试图让下一个page
有一个前面的page
,但是当我正在做的时候,我会得到所有下一页。
这是一个有效的演示。 http://xsltransform.net/jyH9rM4
请让我知道如何解决这个问题。
由于
答案 0 :(得分:1)
我不确定我是否理解输出的外观,但是如果你改变了
<xsl:template match="page" mode="first">
<xsl:variable name="pgn">
<xsl:value-of select="./following::page/following-sibling::page[1]"/>
...
到
<xsl:template match="page" mode="first">
<xsl:variable name="pgn">
<xsl:value-of select="./following::page[preceding-sibling::page][1]"/>
...
您将获得以下输出:
<td class="toc-title">A</td>
<td class="toc-page" valign="bottom">11/4/10A</td>
<?pb label='cclxxii'?><a name="pg_cclxxii"></a>
<td class="toc-title">B</td>
<td class="toc-page" valign="bottom">11/5/1A</td>
<td class="toc-title">C</td>
<td class="toc-page" valign="bottom">11/4</td>
<?pb label='cclxxiiv'?><a name="pg_cclxxiiv"></a>
<td class="toc-title">B</td>
<td class="toc-page" valign="bottom">11/5/1A</td>
<td class="toc-title">C</td>
<td class="toc-page" valign="bottom">11/4</td>
<?pb label=''?><a name="pg_"></a>
不同之处在于:不是选择所有后续页面的所有后续兄弟页面,而是仅选择具有前一个兄弟页面的第一个后续页面。
如果输出应以其他方式显示,请在您的问题中添加所需的输出以避免误解。
您的调整Demo。
正如评论中所提到的,没有可以链接到的后续页面的最后一页将具有空链接。通过以下调整可以避免这种情况:
<xsl:template match="page" mode="first">
<xsl:variable name="pgn">
<xsl:value-of select="./following::page[preceding-sibling::page][3]"/>
</xsl:variable>
<xsl:if test="$pgn != ''">
<xsl:processing-instruction name="pb">
<xsl:text>label='</xsl:text>
<xsl:value-of select="$pgn"/>
<xsl:text>'</xsl:text>
<xsl:text>?</xsl:text>
</xsl:processing-instruction>
<a name="{concat('pg_',$pgn)}"/>
</xsl:if>
</xsl:template>
最后一页的结果:
<td class="toc-title">C</td>
<td class="toc-page" valign="bottom">11/4</td>
在Demo
中调整