如何在XSLT中将节点属性值存储到变量中?
在XSLT中存储节点属性值到变量的实现方法
针对你的需求,结合给出的XML示例,我来一步步说明怎么操作:
首先,你的XML使用了sth:命名空间前缀,所以第一步要确保XSLT里正确声明这个命名空间,不然没法定位到对应的节点。下面是完整的XSLT示例,包含变量定义和验证输出:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sth="http://your-real-sth-namespace" <!-- 替换成XML中sth前缀绑定的真实命名空间URI --> version="1.0"> <xsl:template match="/"> <!-- 示例1:把指定节点的属性值存入变量 --> <!-- 这里选择第一个DocumentVersion节点的id属性 --> <xsl:variable name="firstDocId" select="/sth:mainNode/DocumentVersion[1]/@id" /> <!-- 示例2:根据属性值匹配节点,把目标内容存入变量 --> <!-- 这里匹配id为"01"的DocumentVersion,取出它的Stuff文本内容 --> <xsl:variable name="wantedStuff" select="/sth:mainNode/DocumentVersion[@id='01']/Stuff/text()" /> <!-- 输出变量值,验证是否正确存储 --> <result> <first-document-id><xsl:value-of select="$firstDocId" /></first-document-id> <wanted-content><xsl:value-of select="$wantedStuff" /></wanted-content> </result> </xsl:template> </xsl:stylesheet>
关键注意事项:
- 命名空间必须一致:你的XML根节点
sth:mainNode肯定绑定了一个具体的命名空间URI(格式类似xmlns:sth="http://xxx.com/xxx"),一定要把XSLT里的http://your-real-sth-namespace替换成这个真实URI,否则XSLT找不到目标节点。 - 变量定义的两种方式:
- 简单场景直接用
select属性:像上面的示例一样,通过XPath表达式直接获取属性/节点值,写法简洁效率高。 - 复杂逻辑用内容块:如果需要拼接、条件判断等操作,可以写成
<xsl:variable name="varName">这里放复杂内容</xsl:variable>的形式。
- 简单场景直接用
- XPath属性筛选语法:
DocumentVersion[@id='01']是XPath里的属性选择器,意思是选中所有id属性等于01的DocumentVersion节点,后续可以继续定位它的子节点(比如Stuff)。
预期输出:
把这个XSLT应用到你的XML上,会得到如下结果:
<result> <first-document-id>01</first-document-id> <wanted-content>I want this</wanted-content> </result>
内容的提问来源于stack exchange,提问作者mrB
相关产品推荐
相关产品推荐

