XSLT 1.0:子字符串多个值



我有以下元素和值:

.XML:

<Location>Wing: ; Room: A; Bed: NAH; Group: 195;</Location>

我正在尝试将每个值子字符串到它自己的元素。

我当前的 XSLT:

<PL.1>
<xsl:value-of select="substring-before(//Location, ' ; Room:')" />
</PL.1>
<PL.2>
<xsl:value-of select="substring-before(//Location, 'Bed:')" />
</PL.2>
<PL.3>
<xsl:value-of select="substring-before(//Location, 'Group:')" />
</PL.3>
<PL.4>
<xsl:value-of select="substring-after(//Location, 'Group:')" />
</PL.4>

我要得到的预期结果如下:

<PL.1>Wing: ;</PL.1>
<PL.2>Room: A;</PL.2>
<PL.3>Bed: NAH;</PL.3>
<PL.4>Group: 195;</PL.4>

我知道我的子字符串是错误的,但我不确定确定指向某些点的正确方法。我见过的例子不是调用变量,通常只分隔两件事,所以我很难理解分解两个以上项目的概念。

XSLT 的当前结果:

<PL.1>Wing:</PL.1>
<PL.2 />
<PL.3> 195;</PL.3>
<PL.4 />

使用递归模板,如以下 XSLT-1.0 解决方案所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/root">                        <!-- Adapt to your real conditions -->
<xsl:call-template name="NextStr">
<xsl:with-param name="str" select="Location" /> <!-- Change to //Location if appropriate -->
</xsl:call-template>
</xsl:template>
<xsl:template name="NextStr"> 
<xsl:param name="str" />
<xsl:param name="cnt" select="1" />
<xsl:if test="normalize-space($str)">
<xsl:element name="{concat('PL.',$cnt)}">
<xsl:value-of select="normalize-space(concat(substring-before($str,';'),';'))" />
</xsl:element>
<xsl:call-template name="NextStr">
<xsl:with-param name="str" select="substring-after($str,';')" />
<xsl:with-param name="cnt" select="$cnt + 1" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

此样式表从传递给命名模板的计数器派生PL.x元素名称NextStr。您可以通过从表达式中删除相应的concat(...)来删除尾随;

输出为:

<PL.1>Wing: ;</PL.1>
<PL.2>Room: A;</PL.2>
<PL.3>Bed: NAH;</PL.3>
<PL.4>Group: 195;</PL.4>

尝试使用

<PL.1>
<xsl:value-of select="substring-before(//Location, ' ; Room:')" />
</PL.1>
<PL.2>
<xsl:value-of select="substring-before(//Location, ';Bed:')" />
</PL.2>
<PL.3>
<xsl:value-of select="substring-before(//Location, ';Group:')" />
</PL.3>
<PL.4>
<xsl:value-of select="substring-after(//Location, ';Group:')" />
</PL.4>
<xsl:template match="Location">
<xsl:variable name="a" select="substring-before(.,' Room')"/>
<xsl:variable name="b" select="substring-before(substring-after(.,'Wing: ; '), ' Bed')"/>
<xsl:variable name="c" select="substring-before(substring-after(.,' Room: A; '),' Group')"/>
<xsl:variable name="d" select="substring-after(.,'NAH; ')"/>
<PL.1>
<xsl:value-of select="$a"/>
</PL.1>
<PL.2>
<xsl:value-of select="$b"/>
</PL.2>
<PL.3>
<xsl:value-of select="$c"/>
</PL.3>
<PL.4>
<xsl:value-of select="$d"/>
</PL.4>
</xsl:template>
Use this code

相关内容

  • 没有找到相关文章

最新更新