使用XSLT拆分字符串以提取链接

时间:2013-08-06 15:22:59

标签: xml xslt xslt-1.0 lxml

我正在尝试解决一个简单的计算但失败了。我正在使用XSLT 1.0。我有一个示例XML示例。

<root>
    <slide add_info="Retail" name="slide41.xml" nav_lvl_1="Link Slide" nav_lvl_2="" page_number="41">
        <Text>
            <links>Go for a test-drive, visit us online at http://google.com</links>
            <links>Also, visit our community pages to learn more:</links>
            <links>http://google.com/community/retail</links>
        </Text>
    </slide>
</root>

我希望split the string第一部分是文本,第二部分是以http开头的链接。存在如上所示的情况,其中可能仅存在文本而没有链接或仅存在链接而没有文本。所以我要拆分并放text and link in separate nodes。例如:

    <root>
        <slide add_info="Retail" name="slide41.xml" nav_lvl_1="Link Slide" nav_lvl_2="" page_number="41">
            <split_1>
                 <link_text>Go for a test-drive, visit us online at </link_text>
                 <link_link>http://google.com</link_link>

            </split_1>
        </slide>
    </root>

我是否必须使用正则表达式,或者我有any functions我可以通过它来执行此操作。我不能使用XSLT 2.0。

预期产出:

<w:p>
    <w:r>
        <w:t>Go for a test-drive, visit us online at </w:t>
    </w:r>
    <w:hyperlink r:id="rId7" w:history="1">
        <w:r w:rsidRPr="00E8727D">
            <w:rPr>
                <w:rStyle w:val="Hyperlink"/>
            </w:rPr>
            <w:t>http://google.com/</w:t>
        </w:r>
    </w:hyperlink>
</w:p>
<w:p>
    <w:r>
        <w:t>Also, visit our community pages to learn more:</w:t>
    </w:r>
</w:p>
<w:p>
    <w:hyperlink r:id="rId7" w:history="1">
        <w:r w:rsidRPr="00E8727D">
            <w:rPr>
                <w:rStyle w:val="Hyperlink"/>
            </w:rPr>
            <w:t>http://google.com/community/retail</w:t>
        </w:r>
    </w:hyperlink>
</w:p>

1 个答案:

答案 0 :(得分:1)

你的XSL应该包含这样的模板:

<xsl:template match="links">
     <xsl:if test="contains(text(), 'http:')">
         <split_1>
            <xsl:variable name="before">
                <xsl:value-of select="substring-before(text(), 'http:')"/>
            </xsl:variable>
            <link_text>
                <xsl:value-of select="$before"/>
            </link_text>
            <link_link>
                <xsl:value-of select="substring-after(text(), $before)" />
            </link_link>
        </split_1>
    </xsl:if>
</xsl:template>