XSL如何使用for-each创建对应BlobContent Name属性的自定义子节点
解决方案
你不需要额外添加for-each逻辑,直接修改匹配Reference节点的模板即可,修改后的完整XSLT代码如下:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:output method="xml" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="/doc/att/BlobContent/Reference"> <!-- 取当前Reference父节点BlobContent的Name属性作为新元素名 --> <xsl:element name="{../@Name}"> <xsl:value-of select="@Link"/> </xsl:element> </xsl:template> </xsl:stylesheet>
说明
你之前报错是因为添加for-each逻辑时一次性选中了所有BlobContent节点的Name属性,导致多个属性值被拼接成了非法的元素名。XSLT的模板匹配机制本身会自动为每个符合规则的Reference节点单独执行一次模板逻辑:
- 用
../@Name获取当前Reference节点所属的BlobContent节点的Name属性值 - 通过属性值模板
{}将属性值动态设置为新元素的名称
执行代码后会按预期输出<rtf>和<tif>标签,对应各自的Link路径。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

