只有当我删除条带空间时才会得到预期的输出

时间:2016-07-11 10:36:19

标签: xslt xslt-2.0

我正在编写一个XSLT,其中下面是我的XML

<?xml version="1.0" encoding="UTF-8"?>
<body>
 <para>
        <page num="794"/>20 July 2009
      </para>
      <para>
      cont1<case>
        <casename>
          <content-style font-style="italic">cont1</content-style> &#x0026; <content-style font-style="italic">Drs</content-style>
        </casename>
        <content-style font-style="italic">cont1</content-style>
      </case> cont1 <case>
        <casename>
          <content-style font-style="italic">cont1</content-style> &#x0026; <content-style font-style="italic">cont1</content-style> &#x0026; <content-style font-style="italic">mergCont</content-style>
        </casename>
        <content-style font-style="italic">[2004] 3 108</content-style>
      </case> regarding postponement.
    </para>
   <casename>
          <content-style font-style="italic">Link1</content-style> &#x0026; <content-style font-style="italic">Drs</content-style>
        </casename>
</body>

以下是我的XSLT

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:htm="http://www.w3.org/TR/html5/" exclude-result-prefixes="#all">
    <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

    <xsl:template match="/">
      <hmtl>
        <head>
          <title>New Version!</title>
        </head>
        <xsl:apply-templates/>
      </hmtl>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>


    <xsl:template name="para" match="para">
        <xsl:apply-templates select="./node()[1][self::page]" mode="first"/>
        <xsl:apply-templates select="./phrase/following-sibling::node()[1][self::page]" mode="first"/>
        <div>
            <xsl:choose>
                <xsl:when test="./@align">
                    <xsl:attribute name="class"><xsl:text>para align-</xsl:text><xsl:value-of select="./@align"/></xsl:attribute>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:attribute name="class"><xsl:text>para</xsl:text></xsl:attribute>
                </xsl:otherwise>
            </xsl:choose>
            <xsl:if test="./@num">
                <xsl:variable name="phrl">
                    <xsl:value-of select="string-length(./@num)"/>
                </xsl:variable>
                <xsl:variable name="phrase">
                    <xsl:value-of select="concat('P',./@num)"/>
                </xsl:variable>
                <xsl:variable name="newphrase" select="translate($phrase,'.','-')"/>
                <a>
                    <xsl:attribute name="name"><xsl:value-of select="$newphrase">
            </xsl:value-of></xsl:attribute>
                    <span class="phrase">
                        <xsl:value-of select="./@num"/>
                    </span>
                </a>
            </xsl:if>
            <xsl:choose>
                <xsl:when test="./phrase/following-sibling::node()[1][self::page]">
                    <xsl:apply-templates select="child::node() except descendant::page[1]"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:apply-templates/>
                </xsl:otherwise>
            </xsl:choose>
            <!--<xsl:apply-templates/>-->
        </div>
    </xsl:template>

    <xsl:template match="casename">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="page[not(preceding-sibling::node()[not(self::text()) or normalize-space()])]"/>
    <xsl:template match="page" mode="first">
        <xsl:variable name="pgn">
            <xsl:value-of select="./@num"/>
        </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">
        <xsl:variable name="pgn">
            <xsl:value-of select="./@num"/>
        </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:transform>

在我的XSLT中,当我删除<xsl:strip-space elements="*"/>时,我得到的确切输出。但我没有将page模板匹配,当我添加<xsl:strip-space elements="*"/>时,我的page模板已匹配,但我的HTML中缺少空格。以下是截图。

<xsl:strip-space elements="*"/> 即使我的page匹配,但您可以看到&之前和之后缺少空格

enter image description here

没有<xsl:strip-space elements="*"/> 我的page不匹配

enter image description here

这是DEMO的工作。 http://xsltransform.net/pPzifqu/1

请告诉我,如何获取空格以及page模板匹配。

由于

1 个答案:

答案 0 :(得分:0)

删除此行<xsl:template match="page[not(preceding-sibling::node()[not(self::text()) or normalize-space()])]"/>。当空格未被剥离时,这是匹配的,因此以下模板不匹配。