gpt4 book ai didi

xml - 两个大列表的高效映射

转载 作者:数据小太阳 更新时间:2023-10-29 02:23:15 26 4
gpt4 key购买 nike

我的任务是编写一些 XSLT 2.0 以将一个 XML 文档转换为另一个 XML 文档。我对 XSLT 比较陌生,但在我这样做的这些日子里我学到了很多东西。在此期间,我不得不映射简单的值,即 002 -> TH 等。这对于少于 10 个值的小列表来说很好,我使用了 xsl:choose。但是,我需要将 300 多个值从一个列表映射到另一个列表,反之亦然。每个列表都有一个值和文本描述。这两个列表值并不总是直接映射,因此我可能必须比较文本描述并在必要时使用默认值。

我有两个解决问题的办法:

  1. 使用 xsl:choose:我认为这可能会很慢,而且如果列表中的任何一个发生变化,可能很难更新。

  2. 有一个 XML 文档,其中包含每个列表项之间的关系。我会使用 XPath 表达式来检索关联值:这是我的首选解决方案,因为我相信它将更易于维护和更新。虽然我不确定它是否有效。

我应该使用什么解决方案,我的建议之一,或者是否有更好的方法来映射这些值?

最佳答案

这是一个XSLT 2.0 解决方案

源 XML 文件:

<input>
<data>001</data>
<data>002</data>
<data>005</data>
</input>

“映射”xml文件:

<map>
<default>?-?-?</default>
<input value="001">RZ</input>
<input value="002">TH</input>
<input value="003">SC</input>
</map>

XSLT 转换:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:param name="pmapFile"
select="'C:/temp/deleteMap.xml'" />

<xsl:variable name="vMap"
select="document($pmapFile)" />

<xsl:variable name="vDefault"
select="$vMap/*/default/text()" />

<xsl:key name="kInputByVal" match="input"
use="@value" />

<xsl:template match="/*">
<output>
<xsl:apply-templates/>
</output>
</xsl:template>

<xsl:template match="data">
<data>
<xsl:sequence select=
"(key('kInputByVal', ., $vMap)[1]/text(),
$vDefault
)[1]
"/>
</data>
</xsl:template>
</xsl:stylesheet>

输出:

<output>
<data>RZ</data>
<data>TH</data>
<data>?-?-?</data>
</output>

请注意以下事项:

  1. document() 的使用函数访问存储在单独的 XML 文件中的“映射”xml 文档。

  2. 使用 <xsl:key/> 和 XSLT 2.0 key() 函数来确定和访问每个相应的输出值。第三个参数指定必须访问和索引的 xml 文档。

关于xml - 两个大列表的高效映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/458954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com