请求提供修改指定ZIP对应Territory Code的XSLT示例及外部配置方法
没问题!我来帮你搞定这个XML修改的需求。下面分几种情况给出实现方案,包括基础的硬编码示例,以及更灵活的外部数据源传入方式:
1. 基础硬编码XSLT实现(适合少量修改)
首先假设你的原始XML结构大致如下:
<ZipTerritories> <ZipTerritory> <ZIP>29000</ZIP> <TerritoryCode>0098</TerritoryCode> </ZipTerritory> <ZipTerritory> <ZIP>29455</ZIP> <TerritoryCode>0098</TerritoryCode> </ZipTerritory> </ZipTerritories>
下面是直接在XSLT里写死修改规则的代码,核心用身份模板默认复制所有节点,只对指定ZIP的TerritoryCode做替换:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份模板:默认复制所有节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配ZIP为29000对应的TerritoryCode,替换为新值 --> <xsl:template match="TerritoryCode[../ZIP='29000']"> <TerritoryCode>1298</TerritoryCode> </xsl:template> </xsl:stylesheet>
这种方式简单直接,但如果需要修改的ZIP/代码配对很多,维护起来会很麻烦,推荐用下面的外部数据源方式。
2. 通过外部XML文件传入更新规则(最灵活)
你可以把所有需要更新的ZIP/代码配对单独放在一个XML文件里,和XSLT分离,方便维护。
第一步:创建更新规则XML(比如命名为zip-updates.xml)
<ZipUpdates> <Update> <ZIP>29000</ZIP> <NewTerritoryCode>1298</NewTerritoryCode> </Update> <!-- 可以随时添加更多更新规则 --> <Update> <ZIP>10001</ZIP> <NewTerritoryCode>4567</NewTerritoryCode> </Update> </ZipUpdates>
第二步:编写读取外部XML的XSLT
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 加载外部更新规则文件 --> <xsl:variable name="updates" select="document('zip-updates.xml')/ZipUpdates/Update"/> <!-- 身份模板:默认复制所有内容 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 动态匹配需要修改的TerritoryCode --> <xsl:template match="TerritoryCode"> <xsl:variable name="currentZip" select="../ZIP"/> <!-- 从外部XML查找当前ZIP对应的新代码 --> <xsl:variable name="newCode" select="$updates[ZIP=$currentZip]/NewTerritoryCode"/> <TerritoryCode> <xsl:choose> <xsl:when test="$newCode"> <xsl:value-of select="$newCode"/> </xsl:when> <xsl:otherwise> <!-- 没有匹配的更新规则,保留原代码 --> <xsl:value-of select="."/> </xsl:otherwise> </xsl:choose> </TerritoryCode> </xsl:template> </xsl:stylesheet>
这种方式的优势是:更新规则和XSLT逻辑完全分离,后续修改或添加配对只需要编辑zip-updates.xml,不用动XSLT代码。
3. 通过文本CSV文件传入更新规则
如果你习惯用文本格式管理更新配对,也可以用CSV文件作为数据源。
第一步:创建CSV文件(比如命名为zip-updates.csv)
29000,1298 10001,4567
第二步:编写解析CSV的XSLT(XSLT 1.0版本)
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 加载外部CSV文件内容 --> <xsl:variable name="csvContent" select="document('zip-updates.csv')"/> <!-- 将CSV按换行符拆分成每行 --> <xsl:variable name="lines" select="tokenize($csvContent, ' ')"/> <!-- 身份模板 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配TerritoryCode并查找更新规则 --> <xsl:template match="TerritoryCode"> <xsl:variable name="currentZip" select="../ZIP"/> <xsl:variable name="newCode"> <xsl:call-template name="findMatchingCode"> <xsl:with-param name="lines" select="$lines"/> <xsl:with-param name="targetZip" select="$currentZip"/> </xsl:call-template> </xsl:variable> <TerritoryCode> <xsl:choose> <xsl:when test="$newCode != ''"> <xsl:value-of select="$newCode"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="."/> </xsl:otherwise> </xsl:choose> </TerritoryCode> </xsl:template> <!-- 递归模板:遍历CSV行查找匹配的ZIP --> <xsl:template name="findMatchingCode"> <xsl:param name="lines"/> <xsl:param name="targetZip"/> <xsl:param name="index" select="1"/> <xsl:if test="$index <= count($lines)"> <xsl:variable name="currentLine" select="$lines[$index]"/> <!-- 跳过空行 --> <xsl:if test="$currentLine != ''"> <xsl:variable name="zip" select="substring-before($currentLine, ',')"/> <xsl:variable name="code" select="substring-after($currentLine, ',')"/> <!-- 找到匹配的ZIP就返回对应的代码 --> <xsl:if test="$zip = $targetZip"> <xsl:value-of select="$code"/> </xsl:if> </xsl:if> <!-- 递归处理下一行 --> <xsl:call-template name="findMatchingCode"> <xsl:with-param name="lines" select="$lines"/> <xsl:with-param name="targetZip" select="$targetZip"/> <xsl:with-param name="index" select="$index + 1"/> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet>
注意:如果使用XSLT 2.0及以上版本,解析CSV会更简单,这里的代码兼容XSLT 1.0环境。
内容的提问来源于stack exchange,提问作者Arunabha Basu
相关产品推荐
相关产品推荐

