如何使用 csv 文件在 XSL 中构建键值对映射?
Posted
技术标签:
【中文标题】如何使用 csv 文件在 XSL 中构建键值对映射?【英文标题】:How to build Key Value pair map in XSL using csv file? 【发布时间】:2021-07-29 19:56:19 【问题描述】:我有一个包含键值对的 CSV 文件
Key1,Value1
Key2,Value2
Key3,Value3
我的 XML 数据如下所示
<root>
<child1 attr1="Key1">some value 1</child1>
<child2 attr1="Key2">some value 2</child2>
<child3 attr1="Key3">some value 3</child3>
</root>
我想构建 XSL 文件以将 xml 数据转换为具有这样两列的表格格式。
|Value1|some value 1|
|Value2|some value 2|
|Value3|some value 3|
我已经准备好将数据转换为表格格式并显示的代码。但我找不到代码来构建键值对映射并将 xml 键替换为 csv 文件中存在的值。我经历了很多堆栈溢出问题,但找不到太多帮助。 请引导我完成读取 csv 文件并构建地图并稍后用键替换其值的过程。谢谢
【问题讨论】:
您的处理器是否支持 XSLT 2.0? 另外,它必须是 CSV 文件吗?使用 XML 文件会容易得多。 是的处理器支持 xslt 2.0,我们需要使用 csv 文件,因为我只在 csv 文件中生成键值对表 那么你可以使用unparsed-text()
函数读取CSV文件,然后tokenize()
将其转换为树。然后,您可以使用key
从那里查找。
@michael.hor257k 如果我使用第二个 xml 而不是 csv 文件,您将如何处理?
【参考方案1】:
XSLT 3 和 XPath 3.1 具有 map
数据类型,因此您可以使用(例如 Saxon 9.8 或更高版本、Saxon JS 2、Altova XML 2017 R3 及更高版本)
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
exclude-result-prefixes="#all"
expand-text="yes">
<xsl:param name="csv-file" as="xs:string" expand-text="no">data.csv</xsl:param>
<xsl:param name="map" as="map(xs:string, xs:string)"
select="(unparsed-text-lines($csv-file) ! (let $tokens := tokenize(., ',') return map $tokens[1] : $tokens[2] )) => map:merge()"/>
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:value-of select="root/* ! ('|' || $map(@attr1) || '|' || . || '|')" separator=" "/>
</xsl:template>
</xsl:stylesheet>
【讨论】:
以上是关于如何使用 csv 文件在 XSL 中构建键值对映射?的主要内容,如果未能解决你的问题,请参考以下文章
JAVA:如何将 JSON 键值对映射到不同的变量 Jackson