在XSLT 1.0中从字符串中提取多个子字符串

时间:2015-02-26 16:32:26

标签: xml string xslt substring xslt-1.0

今天在这个看似不可能的问题上花了太长时间,我的智慧结束了。感谢任何帮助,搜索stackoverflow高低。

我有一个字符串,我试图用XSLT进行操作,例如

' 男人开始红色END女人START孩子END兔子START END鹅蓝色'

我试图提取START和END之间的所有子串,并连接成一个新的字符串。

所以结果字符串应为:

' 红色小鹅'

谢谢 - 罗布

1 个答案:

答案 0 :(得分:3)

我们不知道这个字符串来自哪里,但假设输入文件如

XML输入

<?xml version="1.0" encoding="UTF-8"?>
<input>man START red END woman START child END rabbit START goose END blue</input>

XSLT样式表

编写一个递归命名模板,用于在字符串中查找STARTEND的出现次数。

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />

    <xsl:template match="input">
      <output>
          <xsl:call-template name="find-relevant-text">
              <xsl:with-param name="string" select="."/>
          </xsl:call-template>
      </output>
    </xsl:template>

    <xsl:template name="find-relevant-text">
        <xsl:param name="string"/>

        <xsl:if test="contains($string,'START')">
            <xsl:value-of select="substring-before(substring-after($string,'START '),'END')"/>
            <xsl:call-template name="find-relevant-text">
                <xsl:with-param name="string" select="substring-after($string,'END ')"/>
            </xsl:call-template>
        </xsl:if>

    </xsl:template>

</xsl:transform>

XML输出

<?xml version="1.0" encoding="UTF-8"?>
<output>red child goose </output>

如果您担心最后的空格字符,请使用

<xsl:template name="find-relevant-text">
    <xsl:param name="string"/>

    <xsl:if test="contains($string,'START')">

        <xsl:variable name="relevant-part" select="substring-before(substring-after($string,'START '),' END')"/>
        <xsl:variable name="remainder" select="substring-after($string,'END ')"/>

        <xsl:value-of select="$relevant-part"/>
        <xsl:if test="contains($remainder,'START')">
            <xsl:text> </xsl:text>
        </xsl:if>
        <xsl:call-template name="find-relevant-text">
            <xsl:with-param name="string" select="$remainder"/>
        </xsl:call-template>
    </xsl:if>

</xsl:template>