如何使用 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="&#10;"/>
  </xsl:template>
  
</xsl:stylesheet>

【讨论】:

以上是关于如何使用 csv 文件在 XSL 中构建键值对映射?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA:如何将 JSON 键值对映射到不同的变量 Jackson

React 中的数组与键值对(映射/对象)

如何在处理 HTTP 请求之前将 csv 文件同步加载到内存中

如何使用优先队列根据键值对的值进行排序

在 .CSV 文件中为 XML 解析创建 XSL

如何使用 XSL 将 XML 转换为 CSV