XSLT新手求助:如何将输出根元素FORM动态替换为Types属性值?
动态调整XSLT输出根元素为XML中Types属性的取值
我是XSL新手,之前靠Stack Overflow帖子实现了部分功能,现在重新捡起来用,想修改现有模板,让输出的根元素不再是固定的<FORM>,而是根据原始XML里Types属性的取值动态生成——比如取值是Documents就输出<Documents>,是Photos就输出<Photos>。
输入XML示例
<?xml version='1.0' encoding='UTF-8' ?> <document> <properties> <basic> <property id="Types"> <value>Documents</value> </property> <property id="name"> <value>File_Name</value> </property> <property id="Number"> <value>2989389389893</value> </property> <property id="Date"> <value>1/13/2022</value> </property> <property id="latestDocType"> <value>PDF</value> </property> </basic> </properties> </document>
当前使用的XSLT模板
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8"></xsl:output> <xsl:key name="preg" match="property" use="@id"/> <xsl:template match="/"> <xsl:element name="FORM"> <xsl:for-each select="key('preg','Types')"> <xsl:element name="Types"> <xsl:value-of select="value"/> </xsl:element> </xsl:for-each> <xsl:for-each select="key('preg','Number')"> <xsl:element name="Number"> <xsl:value-of select="value"/> </xsl:element> </xsl:for-each> <xsl:element name="name"> <xsl:for-each select="key('preg','name')"> <xsl:text disable-output-escaping="yes"></xsl:text> <xsl:value-of select="value"/> </xsl:for-each> <xsl:for-each select="key('preg','latestDocType')"> <xsl:text disable-output-escaping="yes">.</xsl:text> <xsl:value-of select="value"/> </xsl:for-each> </xsl:element> </xsl:element> </xsl:template> </xsl:stylesheet>
当前输出结果
<FORM> <Types>Documents</Types> <Number>2989389389893</Number> <name>File_Name.PDF</name> </FORM>
预期输出
当Types属性值为Documents时:
<Documents> <Types>Documents</Types> <Number>2989389389893</Number> <name>File_Name.PDF</name> </Documents>
当Types属性值为Photos时:
<Photos> <Types>Photos</Types> <Number>2989389389893</Number> <name>File_Name.PDF</name> </Photos>
修改后的XSLT模板
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:key name="preg" match="property" use="@id"/> <xsl:template match="/"> <!-- 动态获取Types属性的值作为根元素名称 --> <xsl:variable name="rootName" select="key('preg','Types')/value"/> <xsl:element name="{$rootName}"> <xsl:for-each select="key('preg','Types')"> <xsl:element name="Types"> <xsl:value-of select="value"/> </xsl:element> </xsl:for-each> <xsl:for-each select="key('preg','Number')"> <xsl:element name="Number"> <xsl:value-of select="value"/> </xsl:element> </xsl:for-each> <xsl:element name="name"> <xsl:value-of select="key('preg','name')/value"/> <xsl:text>.</xsl:text> <xsl:value-of select="key('preg','latestDocType')/value"/> </xsl:element> </xsl:element> </xsl:template> </xsl:stylesheet>
修改说明
- 新增
$rootName变量,通过key('preg','Types')/value获取Types属性的取值 - 将原来固定的
<xsl:element name="FORM">替换为<xsl:element name="{$rootName}">,实现动态生成根元素名称 - 简化
<name>元素内的代码,去掉多余的for-each和disable-output-escaping(此处该属性无必要)
内容的提问来源于stack exchange,提问作者Jim W
相关产品推荐
相关产品推荐

