如何使用XSLT根据属性值获取XML数据并处理多语言description节点
XSLT实现优先获取威尔士语描述的逻辑
没问题,我来帮你搞定这个需求!核心逻辑就是优先选用带language='W'且非空的威尔士语描述,如果这个不存在或者是空内容,再 fallback 到无属性的英文描述。下面是具体的实现代码和说明:
完整XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- 匹配你需要处理的父节点(这里以根节点下的item为例,可根据实际结构调整) --> <xsl:template match="/root/item"> <processed-item> <preferred-description> <xsl:call-template name="get-preferred-description"/> </preferred-description> </processed-item> </xsl:template> <!-- 核心逻辑模板:获取优先描述 --> <xsl:template name="get-preferred-description"> <!-- 先筛选出有效威尔士语描述:带language='W'且内容非空(排除纯空格的空节点) --> <xsl:variable name="valid-welsh-desc" select="description[@language='W' and normalize-space(.) != '']"/> <xsl:choose> <!-- 如果有有效威尔士语描述,就输出它 --> <xsl:when test="$valid-welsh-desc"> <xsl:value-of select="$valid-welsh-desc"/> </xsl:when> <!-- 否则输出无属性的英文描述 --> <xsl:otherwise> <xsl:value-of select="description[not(@language)]"/> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
代码说明
- 精准筛选:用
$valid-welsh-desc变量筛选出真正有效的威尔士语描述,normalize-space(.) != ''能排除那些只有空格的空节点,避免无效内容被选中。 - 优先级分支:通过
xsl:choose实现明确的优先级判断,优先处理威尔士语描述,再 fallback 到英文描述。 - 复用性强:把核心逻辑封装成命名模板
get-preferred-description,你可以在多个需要获取描述的地方直接调用,让代码更整洁。
测试示例
假设你有这样的源XML:
<root> <!-- 场景1:威尔士语描述有效 --> <item> <description language="W">Dyma ddisgrifiad Cymraeg</description> <description>This is the English fallback</description> </item> <!-- 场景2:威尔士语描述为空(纯空格) --> <item> <description language="W"> </description> <description>English description when Welsh is empty</description> </item> <!-- 场景3:没有威尔士语描述 --> <item> <description>Only English available here</description> </item> </root>
处理后会得到符合预期的结果:
<processed-item> <preferred-description>Dyma ddisgrifiad Cymraeg</preferred-description> </processed-item> <processed-item> <preferred-description>English description when Welsh is empty</preferred-description> </processed-item> <processed-item> <preferred-description>Only English available here</preferred-description> </processed-item>
完全贴合你的需求逻辑~
内容的提问来源于stack exchange,提问作者jesal
相关产品推荐
相关产品推荐

