XSL获取子节点数据问题:如何提取DESCRIPTION子节点内容?
嘿,我来帮你排查一下为啥你的XSL代码没成功提取DESCRIPTION节点的数据~
首先,咱们先分析几个最可能的原因,再给出对应的解决办法:
1. 检查当前上下文节点是否正确
你写的<xsl:for-each select="RETURN">是基于当前上下文节点来查找RETURN的,如果你的XSL模板没有匹配到XML的根节点(也就是/),那当前上下文可能不是根,自然找不到RETURN节点。
举个正确的例子,先匹配根节点,再去遍历RETURN:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 先匹配XML的根节点 --> <xsl:template match="/"> <html> <body> <!-- 从根节点开始查找RETURN --> <xsl:for-each select="RETURN"> <div> <!-- 直接提取DESCRIPTION的内容,或者用apply-templates --> <xsl:value-of select="DESCRIPTION"/> </div> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
2. 排查XML是否包含命名空间
这是最容易踩坑的点!如果你的XML里有类似xmlns="http://xxx.xxx.com"这样的命名空间声明(比如<RETURN type="object" xmlns="http://example.org">),那XSL里必须声明对应的命名空间前缀,才能正确选中节点。
比如XML带命名空间的情况,XSL要这么写:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://example.org"> <!-- 替换成你的XML实际命名空间 --> <xsl:template match="/"> <html> <body> <!-- 用前缀my来选中命名空间下的RETURN --> <xsl:for-each select="my:RETURN"> <div> <xsl:value-of select="my:DESCRIPTION"/> </div> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
3. 简化你的代码(可选)
其实你不需要嵌套两层<xsl:for-each>,可以直接选中RETURN/DESCRIPTION,代码更简洁:
<xsl:for-each select="RETURN/DESCRIPTION"> <div> <xsl:apply-templates select="."/> </div> </xsl:for-each>
甚至可以用模板匹配的方式,更符合XSL的设计思路:
<xsl:template match="RETURN/DESCRIPTION"> <div> <xsl:apply-templates/> </div> </xsl:template>
你可以先检查自己的XML有没有命名空间,再确认XSL的上下文是否正确,应该就能解决问题啦~
内容的提问来源于stack exchange,提问作者user11243042
相关产品推荐
相关产品推荐

