我在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元素,但那不是问题。
答案 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>