我想提取元素的部分值,并将其作为属性赋予它。
源:
<www>
<sss>
<eee>XML ELEMENT VALUE
[part].HTML element value [HTPART].
HTML element value [HTPART2].
</eee>
</sss>
</www>
它继续这样。方括号[]的内容可能会多次出现。并且源中有许多额外的空间。我想删除多余的空格并显示这样的内容。
输出要求:
<fff>XML ELEMENT VALUE<ggg name="part"/>.HTML element value<ggg name="HTPART"/>.HTML element value<ggg name="HTPART2"/>. </fff>
任何人都可以建议如何做到这一点。我是XSLT的新手。
提前谢谢。
答案 0 :(得分:2)
字符串处理不是XSLT的强项 - 毕竟它是一种XML处理语言,而不是通用语言。
你的问题可以通过递归来解决:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="eee">
<fff>
<xsl:call-template name="process">
<xsl:with-param name="text" select="text()" />
</xsl:call-template>
</fff>
</xsl:template>
<xsl:template name="process">
<xsl:param name="text" select="''" />
<xsl:variable name="head" select="substring-before($text, '[')" />
<xsl:variable name="tag" select="substring-before(substring-after($text, '['), ']')" />
<xsl:variable name="tail" select="substring-after($text, ']')" />
<xsl:choose>
<xsl:when test="$head != '' and $tag != ''">
<xsl:value-of select="$head" />
<ggg name="{$tag}" />
<!-- recursive step: process the remainder of the string -->
<xsl:call-template name="process">
<xsl:with-param name="text" select="$tail" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
以上模板输出,供您输入:
<fff>XML ELEMENT VALUE
<ggg name="part"/>.HTML element value <ggg name="HTPART"/>.
HTML element value <ggg name="HTPART2"/>.
</fff>