XSLT技术问询:如何比较XML不同节点的属性值并输出提示
解决XSLT中节点属性值比较的问题
嘿,刚入门XSLT遇到属性比较的需求太正常了,我来给你拆解怎么实现你要的逻辑~
首先先明确你的需求:要遍历每个<product>节点,把它的id属性和它下属<special>节点的id_product属性做比较,然后根据结果输出提示。先把你给的示例XML贴出来方便对照:
<groupe> <product id='05'> <item> <special id_product = '022'> </special> </item> </product> <product id='05'> <item> <special id_product = '022'> </special> </item> </product> </groupe>
下面是实现这个逻辑的XSLT代码,我会逐段解释:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 设置输出为文本格式,带缩进 --> <xsl:output method="text" indent="yes"/> <!-- 匹配根节点下的<groupe>,作为处理入口 --> <xsl:template match="/groupe"> <!-- 遍历每个<product>节点,逐个处理 --> <xsl:for-each select="product"> <!-- 定义变量存储当前product的id属性值 --> <xsl:variable name="prodId" select="@id"/> <!-- 定义变量存储当前product下special的id_product属性值 --> <xsl:variable name="specialProdId" select="item/special/@id_product"/> <!-- 分支判断:比较两个属性值 --> <xsl:choose> <xsl:when test="$prodId = $specialProdId"> <xsl:text>Product ID </xsl:text> <xsl:value-of select="$prodId"/> <xsl:text> 与 Special 的 id_product </xsl:text> <xsl:value-of select="$specialProdId"/> <xsl:text> 相等! </xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>Product ID </xsl:text> <xsl:value-of select="$prodId"/> <xsl:text> 与 Special 的 id_product </xsl:text> <xsl:value-of select="$specialProdId"/> <xsl:text> 不相等! </xsl:text> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:template> </xsl:stylesheet>
代码关键部分解释:
- 遍历节点:用
<xsl:for-each select="product">循环处理每个产品,确保每个<product>都能被单独检查 - 变量存储属性:把要比较的两个属性值存在变量里,让代码更清晰,也方便后续复用
- 条件判断:用
<xsl:choose>做分支,test="$prodId = $specialProdId"就是核心的比较逻辑——XSLT里直接用=就能做字符串比较;如果需要数值比较,可以改成number($prodId) = number($specialProdId) - 输出格式:用
<xsl:text>输出固定文本, 是换行符,让每条提示单独占一行,可读性更好
如果你的XML里存在一个<product>下有多个<special>的情况,只需要在<product>的循环里再加一层<xsl:for-each select="item/special">,逐个遍历每个special节点即可。
内容的提问来源于stack exchange,提问作者sacamoto
相关产品推荐
相关产品推荐

