如何在XSL属性中填充id值?XML转XML的XSLT转换求助
解决XSLT生成带指定格式id属性的ParentElement元素问题
原代码的问题分析
- 模板匹配的是
ParentElement/Number,仅处理Number元素而非目标的ParentElement,导致原ParentElement被默认模板处理,直接输出子节点文本。 - 未使用
<xsl:attribute>生成id属性,而是直接输出字符串,无法构建正确的元素结构。 - 不必要的
<xsl:apply-templates>会重复处理Number的内容,引发冗余输出。
正确的XSLT实现
假设源XML结构如下(以常见场景为例):
<Root> <ParentElement> <Number>12345.111111.0</Number> </ParentElement> </Root>
对应的XSLT代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 处理根节点,触发后续模板 --> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <!-- 匹配源文档中的ParentElement元素 --> <xsl:template match="ParentElement"> <!-- 生成目标ParentElement元素 --> <ParentElement> <!-- 拼接固定前缀与Number值,生成指定格式的id属性 --> <xsl:attribute name="id"> <xsl:text>abc:efg:id:hij:</xsl:text> <xsl:value-of select="Number"/> </xsl:attribute> <!-- 若需保留原ParentElement的其他子节点,取消下方注释 --> <!-- <xsl:apply-templates/> --> </ParentElement> </xsl:template> <!-- 屏蔽Number元素的默认输出,避免冗余文本 --> <xsl:template match="Number"/> </xsl:stylesheet>
代码说明
- 直接匹配
ParentElement,确保完全控制目标元素的生成逻辑。 - 使用
<xsl:attribute>创建id属性,通过固定前缀abc:efg:id:hij:与Number元素的文本值拼接,得到要求的id格式。 - 添加空模板匹配Number元素,防止其文本被默认模板直接输出。
- 若需要保留原ParentElement的其他子节点,取消
<xsl:apply-templates/>的注释即可。
输出结果
执行上述XSLT后,会生成符合要求的目标元素:
<ParentElement id="abc:efg:id:hij:12345.111111.0"/>
内容的提问来源于stack exchange,提问作者Viji
相关产品推荐
相关产品推荐

