You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:17:56