如何在元素中找到特定文本的第一次出现

时间:2015-05-08 11:47:32

标签: xml xslt xslt-2.0

请建议在特定元素的特定文本的第一个位置插入一些元素。

在给定的样本中,需要识别找到第一个位置的文本“text1”,然后需要插入< first />在'text1'之后。请建议。

XML:

<article>
    <body>
        <list>text1 text2</list>
        <para>The text1 text3 text4</para>
        <para>The text1 text1 text5</para>
        <para>They text1 text1 text1</para>
        <para>The ttext3 ext1 text1</para>
        <para>The <i>text1</i> <u>text1</u></para>
        <para>The <b>text1</b> <b>text1</b></para>
        <para>The text1</para>
        <para>The text2</para>
    </body>
</article>

XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

    <xsl:template match="para//text()">
        <xsl:variable name="varText1" select="'text1'"/>
        <xsl:for-each select="tokenize(., $varText1)">
            <xsl:choose>
                <xsl:when test="position()=1"><xsl:value-of select="."/><first/></xsl:when>
                <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

必填项:

<article>
    <body>
        <list>text1 text2</list>
        <para>The text1<first/> text3 text4</para>
        <para>The text1<first/> text1 text5</para>
        <para>They text1<first/> text1 text1</para>
        <para>The ttext3 ext1 text1<first/></para>
        <para>The <i>text1<first/></i> <u>text1</u></para>
        <para>The <b>text1<first/></b> <b>text1</b></para>
        <para>The text1<first/></para>
        <para>The text2</para>
    </body>
</article>

1 个答案:

答案 0 :(得分:1)

此问题的第一部分是识别每个para中包含“text1”的第一个后代文本节点。识别出该节点后,只需substring-beforesubstring-after

即可
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

    <xsl:template match="text()[. is (ancestor::para[1]//text()[contains(., 'text1')])[1]]">
        <xsl:value-of select="substring-before(., 'text1')" />
        <xsl:text>text1</xsl:text>
        <first/>
        <xsl:value-of select="substring-after(., 'text1')" />            
    </xsl:template>
</xsl:stylesheet>