xml - 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>
我希望能提出一些可以接受任意数量参数的东西。根据其他帖子,我尝试对此进行数字降序排序,但每次都会引发错误(我相信因为它希望排序成为第一条指令,但我不知道以后如何引用它)。
非常感谢任何帮助。
解决方案
怎么样:
<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>
推荐阅读
- python - 解析(OpenDocument)版本 1.2 使其变得简单
- python - 基于另一列的列中的Python百分比计算
- sql-server - 来自数据库的 Flutter Uint8list 字符串呈现为图像
- python - 如何在生成器表达式 Python 中添加限制
- c++ - C++ std::copy 与 std::uninitialized_copy
- pandas - Pandas 1.0.1 - 如何使用包含切片器的列表使用 MultiIndex 索引 DataFrame
- sql - 查找SQL中列值变化的时间范围
- python-3.x - 在我的代码中为 if 语句添加条件?
- javascript - Java Script - 用条件替换文本
- group-by - 在 AWS QLDB / Partiql 中使用 GROUP BY