首页 > 解决方案 > XSLT 2 反向标记化结果

问题描述

我是一名尝试使用 XSLT 2.0 将 XML 文件从一个模式移动到另一个模式的初学者。我在大部分文件上都取得了很大的成功,但有一份让我坚持了下来。输入 XML 元素是地理信息,例如:

<spatial>United States -- Washington -- Asotin county; United States -- Idaho;</spatial>

在上面的示例中,我们有两个位置,从宏观到微观,用分号 (;) 分隔。但是,生成的架构希望它们以相反的顺序排列,并且每个都在它自己的标签中,并用逗号分隔,即:

<mods:geographic>Asotin county, Washington, United States</mods:geographic>
<mods:geographic>Idaho,  United States</mods:geographic>

我们目前正在使用以下方法,它可以工作,但将我们限制为 6 个可能的选项(对于我们的测试数据集很好,但我们有大量数据集要转换并且无法直接控制它们):

<xsl:template match="spatial">
    <xsl:for-each select="tokenize(., ';')">
        <xsl:variable name="spatialPart" select="tokenize(., ' -- ')"/>
            <xsl:if test="normalize-space(.) != ''">
                <!--spatialPart refers to each segment of a full place name; tokenize/separate each segment at space dash dash space-->            
                <geographic>
                    <xsl:value-of separator=", "
                        select="$spatialPart[6], $spatialPart[5], $spatialPart[4], $spatialPart[3], $spatialPart[2], $spatialPart[1]"
                    />
                </geographic>
            </xsl:if>
    </xsl:for-each>
</xsl:template>

我希望能提出一些可以接受任意数量参数的东西。根据其他帖子,我尝试对此进行数字降序排序,但每次都会引发错误(我相信因为它希望排序成为第一条指令,但我不知道以后如何引用它)。

非常感谢任何帮助。

标签: xmlxslt

解决方案


怎么样:

<xsl:template match="spatial">
    <xsl:for-each select="tokenize(., ';')[normalize-space()]">
        <geographic>
            <xsl:value-of select="reverse(tokenize(., ' -- '))" separator=", "/>
        </geographic>
    </xsl:for-each>
</xsl:template>

推荐阅读