使用XSLT 1.0获取节点子元素DESCRIPTION数据失败求助
解决XSLT 1.0提取RETURN/DESCRIPTION元素的问题
我来帮你排查一下这个问题~你的XSLT代码逻辑本身没大问题,但大概率是上下文节点不对或者(如果实际XML有命名空间的话)命名空间未处理导致找不到元素。下面给你具体的解决方案:
常见问题1:上下文节点不匹配
你原代码里的<xsl:for-each select="RETURN">是基于当前节点来查找RETURN元素的,如果你的XSLT的当前节点不是XML文档的根节点,或者XML有外层父节点(比如<root><RETURN>...</RETURN></root>),那这个选择器就找不到目标元素。
修正方案:
直接使用绝对路径或者全局查找来定位元素,同时可以简化嵌套的for-each:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 匹配文档根节点,确保上下文正确 --> <xsl:template match="/"> <!-- 直接选择RETURN下的DESCRIPTION,省去一层for-each --> <xsl:for-each select="RETURN/DESCRIPTION"> <DIV> <!-- 用value-of直接获取文本,比apply-templates更直接(这里效果一致) --> <xsl:value-of select="."/> </DIV> </xsl:for-each> </xsl:template> </xsl:stylesheet>
如果你的RETURN元素不是根节点(比如被其他节点包裹),可以用//RETURN/DESCRIPTION来全局查找所有符合路径的元素,或者写出完整路径比如/root/RETURN/DESCRIPTION。
常见问题2:XML存在命名空间(容易忽略的情况)
如果你的实际XML带有命名空间(比如<ns:RETURN xmlns:ns="http://xxx.com">),而你的XSLT没有声明对应命名空间的话,也会找不到元素。
修正方案:
在XSLT里声明命名空间前缀,并在选择器中使用:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://你的命名空间URL"> <xsl:template match="/"> <xsl:for-each select="ns:RETURN/ns:DESCRIPTION"> <DIV> <xsl:value-of select="."/> </DIV> </xsl:for-each> </xsl:template> </xsl:stylesheet>
测试验证
用你提供的XML测试第一个修正后的XSLT,会输出:
<DIV>Objet créé</DIV>
完全符合你的需求。
内容的提问来源于stack exchange,提问作者zidanow
相关产品推荐
相关产品推荐

