gpt4 book ai didi

xml - 比较 XSLT 中的 CSV

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

这就是我要实现的目标:我有一个 CSV 文件,其中包含 1、4、5.. 等数据(不是固定系列),我有一个 XML,其中有某些节点重复。现在,我需要从该 XML 中删除其位置存在于 CSV 文件中的所有节点。

这就是我尝试这样做的方式:我将 CSV 文件作为参数传递给 XSLT 并调用递归模板来打印 XML。 (多亏了我很久以前看过的帖子..不记得地址了)

问题:“这不起作用”:)

下面是我的示例 XML 和 XSLT。任何帮助将不胜感激。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<Items>
<Item IItemID="">
</Item>
<Item ItemID="100-8754">
</Item>
<Item ItemID="206-4141">
</Item>
<Item ItemID="">
</Item>
</Items>

这是 XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes">
<xsl:param name="ErrorPos" as="xs:string" select="'1,4'"/>
<xsl:template match="*|/">
<xsl:call-template name="commaSplit">
<xsl:with-param name="dataString" select="$ErrorPos"/>
<xsl:with-param name="position" select="1"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="commaSplit">
<xsl:param name="dataString"/>
<xsl:param name="position"/>
Vivek
<xsl:choose>
<xsl:when test="contains($dataString,',')">
<!-- Select the first value to process -->
<xsl:call-template name="getItems">
<xsl:with-param name="errorPosition" select="substring-before($dataString,',')"/>
<xsl:with-param name="position" select="$position"/>
</xsl:call-template>
<!-- Recurse with remainder of string -->
<xsl:call-template name="commaSplit">
<xsl:with-param name="dataString" select="substring-after($dataString,',')"/>
<xsl:with-param name="position" select="$position + 1"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<!-- This is the last value no need to recurse -->
<xsl:call-template name="getItems">
<xsl:with-param name="errorPosition" select="$dataString"/>
<xsl:with-param name="position" select="$position"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Process of individual value here -->
<xsl:template name="getItems" match="/">
<xsl:param name="errorPosition"/>
<xsl:param name="position"/>
<Items>
<xsl:value-of select="$errorPosition"/>
<xsl:value-of select="concat(',',$position)"/><!--Just for testing...will be replaced by copy statement-->
</Items>
</xsl:template>

</xsl:stylesheet>

最佳答案

好问题,+1。

请注意,您使用的是 XSLT 2.0,而不是任何 XSLT 2.0 的特定功能。

这是一个简短的(单一模板,没有递归,没有xsl:call-template,没有xsl:choosexsl:当, xsl:otherwise), true XSLT 2.0 解决方案:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:param name="pErrorPos" as="xs:string" select="'1,4'"/>

<xsl:variable name="vDeletePos" as="xs:integer*" select=
" for $s in tokenize($pErrorPos, ',')
return xs:integer($s)
"/>

<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<xsl:template match="Item[position() = $vDeletePos]"/>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<Items>
<Item IItemID=""/>
<Item ItemID="100-8754"/>
<Item ItemID="206-4141"/>
<Item ItemID=""/>
</Items>

产生了想要的、正确的结果:

<Items>
<Item ItemID="100-8754"/>
<Item ItemID="206-4141"/>
</Items>

解释:

  1. 覆盖 Identity rule .

  2. 标准XPath函数的使用 tokenize() .

关于xml - 比较 XSLT 中的 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8472309/

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