获得第一个以下页面值

时间:2014-10-15 13:08:34

标签: xslt xslt-2.0

我有以下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

请让我知道如何解决这个问题。

由于

1 个答案:

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

中调整