XSLT实现指定XML转换出错,如何正确创建新元素?
XSLT XML转换问题解决
问题说明
需要将以下输入XML:
<?xml version="1.0" encoding="utf-8"?> <items> <element name="Name1" value="Text1"/> <element name="Name2" value="Text2"/> <element name="Name3" value="Text3"/> </items>
转换为目标XML(注:原目标XML中存在结束标签笔误,以下为修正后的正确目标结构):
<?xml version="1.0"?> <goods> <!-- some text --> <Name1>Text1</Name1> <Name2>Text2</Name2> <Name3>Text3</Name3> </goods>
用户编写的XSLT无法正常工作,代码如下:
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" /> <xsl:template match="/"> <xsl:element name="goods"> <xsl:comment> some text </xsl:comment> </xsl:element> </xsl:template> <xsl:template match="/items/element"> <xsl:element name="{@name}"> <xsl:value-of select="@value"/> </xsl:element> </xsl:template> </xsl:stylesheet>
问题根源
你的XSLT中,匹配根节点/的模板仅输出了<goods>元素和注释,但没有触发处理items/element节点的逻辑——XSLT默认只会应用最匹配的模板,且根模板内没有调用其他模板或遍历子节点,导致element对应的模板完全没被执行。
解决方案
方案1:嵌套调用模板
修改根模板,在<goods>内部添加<xsl:apply-templates>来触发element节点的模板:
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" omit-xml-declaration="no"/> <xsl:template match="/"> <goods> <xsl:comment>some text</xsl:comment> <!-- 调用处理element节点的模板 --> <xsl:apply-templates select="items/element"/> </goods> </xsl:template> <xsl:template match="items/element"> <xsl:element name="{@name}"> <xsl:value-of select="@value"/> </xsl:element> </xsl:template> </xsl:stylesheet>
方案2:直接遍历节点(无需单独模板)
在根模板中直接循环处理items/element节点,省去单独的模板定义:
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" omit-xml-declaration="no"/> <xsl:template match="/"> <goods> <xsl:comment>some text</xsl:comment> <!-- 直接遍历生成目标元素 --> <xsl:for-each select="items/element"> <xsl:element name="{@name}"> <xsl:value-of select="@value"/> </xsl:element> </xsl:for-each> </goods> </xsl:template> </xsl:stylesheet>
内容的提问来源于stack exchange,提问作者MagicWorld
相关产品推荐
相关产品推荐

