未输入模板匹配

时间:2014-02-27 05:23:44

标签: xslt xslt-2.0

我在XML中使用了以下代码。

<?xml version="1.0" encoding="UTF-8"?>
<toa>
<title>TABLE OF HONG KONG LEGISLATION</title>
<subtitle>All references are to paragraph number</subtitle>
<toa-section>
<toa-div level="div1">
<title/>
<toa-entry>
<primary-entry>
<entry-name>Banking Ordinance (Cap.155)</entry-name>
<pgs>7.040</pgs>
</primary-entry>
</toa-entry>
</toa-div>
</toa-section>
</toa>

和XSLT如下。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="/">
    <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;&#xD;</xsl:text>
        <html>
            <head>
                <xsl:text disable-output-escaping="yes"><![CDATA[</meta>]]></xsl:text>
                <title>TABLE OF LEGISLATION</title>
                <link rel="stylesheet" href="C:\Users\u0138039\Desktop\In Progress\Company Law-Insolvency 2014 Edition_xml\XSLT\main.css" type="text/css" /><xsl:text disable-output-escaping="yes"><![CDATA[</link>]]></xsl:text>
            </head>
            <body>
                <section class="tr_toa">
                    <xsl:call-template name="toa"></xsl:call-template>
                </section>
            </body>
        </html>
    </xsl:template>

    <xsl:template name="toa">
        <div class="toa">
            <a name="CLI_TOL_01"> </a>
            <xsl:apply-templates />
        </div>
    </xsl:template>
    <xsl:template match="toa/title">
        <div class="toa-title">
            <xsl:value-of select="current()/content-style/text()"/>
        </div>
    </xsl:template>
    <xsl:template match="toa-section">
        <div class="toa-section">
            <xsl:for-each select="current()/toa-div">
                <xsl:call-template name="toa-div" />
            </xsl:for-each>
        </div>
    </xsl:template>
    <xsl:template match="toa-div" name="toa-div">
        <xsl:variable name="divClass" select="concat('toa-div level-', current()/@level)"></xsl:variable>
        <div class="{$divClass}">
            <div class="toa-div-title">
                <xsl:variable name="fontStyle">
                    <xsl:value-of select="concat('font-style-',title/content-style/@font-style)"/>
                </xsl:variable>
                <span class="{$fontStyle}">
                    <xsl:value-of select="current()/title/content-style/text()"/>
                </span>
            </div>
            <xsl:apply-templates select="toa-entry" />
        </div>
    </xsl:template>

    <xsl:template match="toa-entry">
        <xsl:choose>
            <xsl:when test="not(preceding-sibling::toa-entry[1]/primary-entry/secondary-entry/node()) and position() != 1">

            </xsl:when>
            <xsl:otherwise>
                <table class="toa-entry">
                    <tbody>
                        <xsl:apply-templates select="primary-entry" />
                        <xsl:if test="not(current()/primary-entry/secondary-entry/node())">
                            <xsl:apply-templates select="following-sibling::toa-entry[1]" mode="next"/>
                        </xsl:if>
                    </tbody>
                </table>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="toa-entry" mode="next">
        <xsl:apply-templates  select="primary-entry"/>
        <xsl:if test="not(current()/primary-entry/secondary-entry/node())">
            <xsl:apply-templates select="following-sibling::toa-entry[1]" mode="next"/>
        </xsl:if>
    </xsl:template>

    <xsl:template match="primary-entry">
        <tr class="primary-entry">
            <td class="entry-name">
             <xsl:value-of select="current()/entry-name/text()"/>
                    </td>
                    <xsl:if test="current()/pgs/node()">
                        <td class="pgs" >
                            <xsl:variable name="pgcount" select="count(current()/pgs)"/>

                            <xsl:for-each select="current()/pgs">
                               <xsl:apply-templates select="./pgs"></xsl:apply-templates>

                    </xsl:for-each>
                </td>
            </xsl:if>
        </tr>
        <xsl:if test="current()/secondary-entry/node()">
            <xsl:for-each select="current()/secondary-entry">
                <tr class="secondary-entry">
                    <td class="entry-name">
                        <xsl:value-of select="current()/entry-name/text()"/>
                    </td>
                    <xsl:if test="current()/pgs/node()">
                        <td class="pgs" >
                            <xsl:variable name="pgcount" select="count(current()/pgs)"/>

                            <xsl:for-each select="current()/pgs">
                               <xsl:apply-templates></xsl:apply-templates>
                            </xsl:for-each>
                        </td>
                    </xsl:if>
                </tr>
            </xsl:for-each>
        </xsl:if>
    </xsl:template>


<xsl:template match="pgs">
    <td class="pgs">
       <xsl:analyze-string select="." regex="[^,\s]+">
            <xsl:matching-substring>
                <xsl:variable name="range" select="tokenize(.,'—')"/>
                <xsl:variable name="pg" select="tokenize(.,'/')"/>
                <xsl:choose>
                    <xsl:when test="contains($pg[3],'—')">
                        <xsl:variable name="range-pg" as="item()*">
                            <xsl:for-each select="$range">
                                <xsl:sequence select="tokenize(.,'/')"/>
                            </xsl:for-each>
                        </xsl:variable>
                        <xsl:for-each select="xs:integer($range-pg[3]) to xs:integer($range-pg[6])">
                            <a href="er:#HKWBV1_ORD_{
                                if (string(number($range-pg[1]))!='NaN') then 
                                format-number(number($range-pg[1]),'00') 
                                else 
                                $range-pg[1]}/P{string-join($range-pg[position()=(1,2)],'/')}/{.}">
                                <xsl:value-of select="concat(string-join($range-pg[position()=(1,2)],'/'),'/',.)"/>
                            </a>
                            <xsl:text>, </xsl:text>
                        </xsl:for-each>
                    </xsl:when>
                    <xsl:otherwise>
                        <a href="er:#HKWBV1_ORD_{
                            if (string(number($pg[1]))!='NaN') then 
                            format-number(number($pg[1]),'00') 
                            else 
                            $pg[1]}/P{$pg[1]
                            }/{string-join($pg[position()>1],'/')}">
                            <xsl:value-of select="."/>
                        </a>                            
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:matching-substring>
            <xsl:non-matching-substring>
                <xsl:value-of select="."/>
            </xsl:non-matching-substring>
        </xsl:analyze-string>           
    </td>
</xsl:template>

</xsl:stylesheet>

虽然我已经为pgs编写了模板匹配,但在调试时,流程没有进入模板。请告诉我哪里出错了。

由于

1 个答案:

答案 0 :(得分:1)

变化

<xsl:template match="primary-entry">
    <tr class="primary-entry">
        <td class="entry-name">
            <xsl:value-of select="current()/entry-name/text()"/>
        </td>
        <xsl:if test="current()/pgs/node()">
            <td class="pgs" >
                <xsl:variable name="pgcount" select="count(current()/pgs)"/>
                <xsl:for-each select="current()/pgs">
                    <xsl:apply-templates select="./pgs"></xsl:apply-templates>
                </xsl:for-each>
            </td>
        </xsl:if>

<xsl:template match="primary-entry">
    <tr class="primary-entry">
        <td class="entry-name">
            <xsl:value-of select="current()/entry-name/text()"/>
        </td>
        <xsl:if test="current()/pgs/node()">
            <xsl:apply-templates select="pgs"/>
        </xsl:if>

并对辅助模板执行相同的操作。