在span中删除特殊字符

时间:2014-05-24 20:39:42

标签: html xml xslt

我在XML文件中有一个这样的节点,我用XSLT 2.0进行转换:

<h2><span class='sun'>☼☼</span> my text (G1.2)</h2>

,其中包含一些HTML特殊字符,如您所见。

现在我需要像这样生成XHTML:

<a href="....">my text</a>

所以我必须去除()之间的跨度和东西,并使用其余的来生成h2标头。 剥离(),我有这个:

<xsl:value-of select="normalize-space(replace( . ,'\([^\)]*\)'  ,''))"/>

哪个有效。但要剥离跨度,我不能使用

<xsl:template match="span[@class='sun']"/>

因为我不再在xsl:value-of之后应用模板了。因此,从不应用span-template。

我可以在同一行中剥离跨度吗?如果没有,我怎样才能剥离跨度? 或者我可以以某种方式替换相同替换功能中的特殊字符吗?然后我将留下一个空的span元素,但那不是问题。

2 个答案:

答案 0 :(得分:1)

您可以将child::text()的{​​{1}}内容与<h1>元素分开匹配。这应该有效:

child::span

答案 1 :(得分:0)

这是迄今为止的模板。它(toct)递归地从HTML h1 / h2 / h3结构生成目录。 它应用如下:

<xsl:call-template name="toct">
    <xsl:with-param name="nodes" select="document(file)//(h1|h2|h3)"/>
    <xsl:with-param name="file" select="replace (file,'xml', 'xhtml')"/>
</xsl:call-template>


<xsl:template name="toct">
    <xsl:param name="nodes"/>
    <xsl:param name="file"/>
    <xsl:if test="count($nodes) > 0">
        <xsl:for-each-group select="$nodes" group-starting-with="*[local-name() = name($nodes[1])]">
            <li>
                <!-- do not include empty header tags in the TOC -->
                <a>
                    <xsl:choose>
                        <xsl:when test="text()">
                            <xsl:if test="name($nodes[1])='h1'">
                                <xsl:attribute name="id"><xsl:value-of select="$nodes[1]/@id"/></xsl:attribute>
                            </xsl:if>
                            <xsl:attribute name="href"><xsl:value-of select="$file"/>#<xsl:value-of select="@id"/></xsl:attribute>
                            <xsl:value-of select="normalize-space(replace(replace( string-join(node(),'') , '[☼*]' ,'') ,'\([^\)]*\)' ,''))"/>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:attribute name="class">invisible</xsl:attribute>
                            <xsl:text>-</xsl:text>
                        </xsl:otherwise>
                    </xsl:choose>
                </a>
                <xsl:if test="current-group()[2]">
                    <ol>
                        <xsl:call-template name="toct">
                            <!-- strip the first node in the list. This is why you can use $nodes[1] to find out
                                which level of <h_> tags you are at -->
                            <xsl:with-param name="nodes" select="current-group() except ."/>
                            <xsl:with-param name="file" select="$file"/>
                        </xsl:call-template>
                    </ol>
                </xsl:if>
            </li>
        </xsl:for-each-group>
    </xsl:if>
</xsl:template>