apply- templates选择子串后

时间:2014-11-11 10:49:23

标签: xslt xslt-2.0

我有以下的XML。

<toc-item>
  <toc-title>
      6A.   <content-style font-style="italic">(Repealed 64 of 1989 s.9)
            </content-style>
  </toc-title>
  <toc-pg>U2/6A</toc-pg>
</toc-item>

我正在运行下面的XSLT。

    <xsl:template name="toc" match="toc">
    <div class="toc">
        <div class="toc-part">
            <table class="toc-div">
                <tbody>
                    <tr>
                        <td>
                            <xsl:for-each select="toc-part/toc-div/toc-item">
                                <xsl:call-template name="toc-item"/>
                            </xsl:for-each>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </div>
</xsl:template>
<xsl:template name="toc-item" match="toc-item">
    <xsl:variable name="tocpg">
        <xsl:value-of select="concat('P',normalize-space(current()/toc-pg/text()))"/>
    </xsl:variable>
    <xsl:variable name="tocpgtag">
        <xsl:choose>
            <xsl:when test="contains($tocpg,'.')">
                <xsl:value-of select="translate($tocpg,'.', '-')"/>
            </xsl:when>
            <xsl:when test="contains($tocpg,'/')">
                <xsl:value-of select="translate($tocpg,'/', '-')"/>
            </xsl:when>
        </xsl:choose>
    </xsl:variable>
    <xsl:variable name="chapternumber">
        <!-- Get num attribute of parent node -->
        <xsl:value-of select="ancestor::chapter[1]/@num"/>
    </xsl:variable>
    <xsl:variable name="nu">
        <xsl:number format="I."/>
    </xsl:variable>
    <xsl:variable name="Brac">
        <xsl:call-template name="get_number_type">
            <xsl:with-param name="number_string" select="./@num"/>
        </xsl:call-template>
    </xsl:variable>
    <xsl:variable name="NewL">
        <xsl:value-of select="normalize-space($chapternumber)"/>
    </xsl:variable>
    <xsl:variable name="size">
        <xsl:value-of select="fn:string-length($NewL)"/>
    </xsl:variable>
    <xsl:variable name="newNum">
        <xsl:choose>
            <xsl:when test="$size=1">
                <xsl:value-of select="concat('0',normalize-space($NewL))"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="normalize-space($NewL)"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:variable name="d">
        <xsl:value-of select="concat('toc-item-',$ThisDocument//ntw:nums[@num=1]/@word,'-level')"/>
    </xsl:variable>
    <xsl:variable name="new">
        <xsl:value-of select="concat('er:#HKWBV1_ORD_',$newNum,'/',$tocpgtag)"/>
    </xsl:variable>
    <table class="toc-item-first-level">
        <tbody>
            <tr>
                <xsl:choose>
                    <xsl:when test="./toc-pg">
                        <xsl:choose>
                            <xsl:when test="fn:contains(./toc-title,'.')">
                                <td class="toc-item-num">
                                    <xsl:value-of select="concat(substring-before(./toc-title,'.'),'.')"/>
                                </td>
                            </xsl:when>
                            <xsl:otherwise>
                                <td colspan="2" align="left" class="padtit">
                                    <xsl:value-of select="./toc-title"/>
                                </td>
                            </xsl:otherwise>
                        </xsl:choose>
                        <xsl:choose>
                            <xsl:when test="fn:contains(./toc-title,'.')">
                                <td class="toc-title">
                                    <xsl:apply-templates select="./toc-title" mode="x"/>
                                </td>
                            </xsl:when>
                            <xsl:otherwise>
                    </xsl:otherwise>
                        </xsl:choose>
                        <td class="toc-pg">
                            <xsl:choose>
                                <xsl:when test="contains(./toc-pg,'.')">
                                    <xsl:value-of select="normalize-space(current()/toc-pg)"/>
                                </xsl:when>
                                <xsl:when test="contains(./toc-pg,'/')">
                                    <a href="{$new}">
                                        <xsl:value-of select="normalize-space(current()/toc-pg)"/>
                                    </a>
                                </xsl:when>
                                <xsl:otherwise>
                                    <a href="{concat('#pg_',toc-pg)}">
                                        <xsl:value-of select="normalize-space(current()/toc-pg)"/>
                                    </a>
                                </xsl:otherwise>
                            </xsl:choose>
                        </td>
                    </xsl:when>
                    <xsl:otherwise>
                        <td align="center" colspan="3">
                            <span class="font-style-bold">
                                <xsl:apply-templates select="./toc-title"/>
                            </span>
                        </td>
                    </xsl:otherwise>
                </xsl:choose>
            </tr>
        </tbody>
    </table>
    <!--</table>-->
</xsl:template>
<xsl:template match="toc-title/text()" mode="x">
    <xsl:analyze-string select="substring-after(.,'.')" regex="(\w)">
        <xsl:matching-substring>
            <xsl:apply-templates select="regex-group(1)"/>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:value-of select="."/>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
</xsl:template>

这里我想要实现的是XML toc-title content-style<td>后面有一个数字,此处我的输出有2 . < / p>

  1. .
  2. 之前的数字
  3. .之后的内容 如果apply-templates之后除了文字之外没有其他标签,我可以正确地获取文字,并且我想.之后的内容{{1}},请让我知道我是怎么做的可以做到这一点。
  4. 这是demo

    由于

0 个答案:

没有答案