从 XSLT 1.0 中的字符串中提取多个子字符串
Extracting multiple substrings from a string in XSLT 1.0
今天在这个看似不可能的问题上花费了太多时间,我束手无策。非常感谢任何帮助,搜索 Whosebug 的高低。
我有一个字符串正在尝试使用 XSLT 进行操作,例如
'男人开始红色结束女人child结束兔子开始鹅结束蓝色'
我正在尝试提取 START 和 END 之间的所有子字符串,并连接成一个新字符串。
所以结果字符串应该是:
'红色child鹅'
谢谢 - 罗布
我们不知道这个字符串是从哪里来的,但是假设输入文档像
XML 输入
<?xml version="1.0" encoding="UTF-8"?>
<input>man START red END woman START child END rabbit START goose END blue</input>
XSLT 样式表
编写一个递归命名模板,查找字符串中出现的 START
和 END
。
<?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>
今天在这个看似不可能的问题上花费了太多时间,我束手无策。非常感谢任何帮助,搜索 Whosebug 的高低。
我有一个字符串正在尝试使用 XSLT 进行操作,例如
'男人开始红色结束女人child结束兔子开始鹅结束蓝色'
我正在尝试提取 START 和 END 之间的所有子字符串,并连接成一个新字符串。
所以结果字符串应该是:
'红色child鹅'
谢谢 - 罗布
我们不知道这个字符串是从哪里来的,但是假设输入文档像
XML 输入
<?xml version="1.0" encoding="UTF-8"?>
<input>man START red END woman START child END rabbit START goose END blue</input>
XSLT 样式表
编写一个递归命名模板,查找字符串中出现的 START
和 END
。
<?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>