基于语言上下文使用XSLT移除指定XML节点的问题求助
正确XSLT实现方案
原始XML示例
<Product> <ValueGroup language="en"> <Value LOVQualifierID="Y"/> </ValueGroup> <ValueGroup language="fr"> <Value LOVQualifierID="N"/> </ValueGroup> <prd_att_description language="en">English Description</prd_att_description> <prd_att_description language="fr">French Description</prd_att_description> </Product>
错误XSLT示例(问题:未按语言关联过滤条件)
<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> <xsl:template match="prd_att_description[../ValueGroup/Value/@LOVQualifierID='Y']"/> </xsl:stylesheet>
正确XSLT代码
<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> <!-- 按语言匹配过滤prd_att_description --> <xsl:template match="prd_att_description"> <xsl:variable name="current-lang" select="@language"/> <!-- 获取对应语言ValueGroup的Qualifier状态 --> <xsl:variable name="qualifier-status" select="/Product/ValueGroup[@language=$current-lang]/Value/@LOVQualifierID"/> <!-- 仅保留Qualifier为N的节点 --> <xsl:if test="$qualifier-status = 'N'"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:if> </xsl:template> </xsl:stylesheet>
核心逻辑说明
- 身份模板:保证所有未被特殊模板匹配的节点和属性都原样复制,避免丢失其他内容。
- 语言关联匹配:对每个
prd_att_description节点,先提取其language属性,再找到同语言的ValueGroup节点,获取对应的LOVQualifierID值。 - 过滤规则:仅当对应语言的
LOVQualifierID为N时,保留当前prd_att_description节点;为Y则直接跳过(不输出)。
预期输出
<Product> <ValueGroup language="en"> <Value LOVQualifierID="Y"/> </ValueGroup> <ValueGroup language="fr"> <Value LOVQualifierID="N"/> </ValueGroup> <prd_att_description language="fr">French Description</prd_att_description> </Product>
内容的提问来源于stack exchange,提问作者Saffe
相关产品推荐
相关产品推荐

