这可以让您了解如何解决它:
<?xml version="1.0"?>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<!-- Only our text element requires special handling here....-->
<xsl:template match="text">
<xsl:copy>
<xsl:choose>
<xsl:when test="matches(.,'Paragraph\s+\d*')">
<!-- Save original text value here -->
<xsl:variable name="temp" select="."/>
<!-- Save the value of <italic>x</italic> child element -->
<xsl:variable name="italic_val" select="italic/text()"/>
<xsl:analyze-string select="." regex="(Paragraph\s+\d*)">
<xsl:matching-substring>
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="concat(replace(regex-group(1),'\s',''),'(',$italic_val,')')"/>
</xsl:attribute>
<xsl:value-of select="$temp"/>
</xsl:element>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:when>
<xsl:otherwise>DOESNT MATCH</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
它基本上使用 XSLT 标识模板来复制原始文档并定义一个模板来处理<text>
元素。它在那里分析其 Text() 内容和适当的正则表达式: Paragraph 。如果它发现它生成了anchor子结构。为此,我使用了一些临时变量。
这是我的输出文件:
<xml>
<para>
<number>1</number>
<text><a href="Paragraph1(A)"> Paragraph 1(A) is this para.</a></text>
</para>
</xml>
我仍然缺少第 1( <italic>A</italic>
) 段,而不是我得到的:第 1(A) 段,但这只是一些调整......
看看这个链接它可以帮助你理解 XSLT 中的 Regex
注意它使用 XSLT 2.0