xml 文件需要使用 xslt 转换

Need to use xslt transformation for xml file

我是 xslt 的新手,多次重试后我无法从这里继续。目前我准备的xslt是:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="action">
<action> 
    <xsl:apply-templates select="@*|node()"/>
   <attribute name="phase" value="new" />
</action>    
</xsl:template>
</xsl:stylesheet>

这会更改此输入 xml :

<root>
<attribute name="phases">
<tag>
  <entryMap name="startphase">
    <action>
      <type>Some type</type>
      <attribute name="first" value="abc" />
    </action>
  </entryMap>
</tag>
</attribute>
</root>

到此输出 xml(在 <action> 内和 <type> 之后添加 <attribute name="phase" value="new"/>):

<root>
<attribute name="phases">
  <tag>
     <entryMap name="startphase">
        <action>
           <type>Some type</type>
           <attribute name="first" value="abc"/>
           <attribute name="phase" value="new"/>
        </action>
     </entryMap>
  </tag>
</attribute>
</root>

我的 xml 文件可以更改并具有多个阶段,因此我需要在 xslt 文件中进行更改以转换此示例输入 xml :

<root>
<attribute name="phases">
    <tag>
      <entryMap name="startphase">
        <action>
          <type>Some type</type>
          <attribute name="first" value="abc" />
        </action>
      </entryMap>
    </tag>
</attribute>
<attribute name="phases">
    <tag>
      <entryMap name="midphase">
        <action>
          <type>Some other type</type>
          <attribute name="second" value="def" />
        </action>
      </entryMap>
    </tag>
</attribute>
<attribute name="phases">
    <tag>
      <entryMap name="endphase">
        <action>
          <type>Other type</type>
          <attribute name="third" value="ghi" />
        </action>
      </entryMap>
    </tag>
</attribute>
</root>

到这个输出文件:

<root>
   <attribute name="phases">
      <tag>
         <entryMap name="startphase">
            <action>
               <type>Some type</type>
               <attribute name="first" value="abc"/>
               <attribute name="phase" value="startphase"/>
            </action>
         </entryMap>
      </tag>
   </attribute>
   <attribute name="phases">
      <tag>
         <entryMap name="midphase">
            <action>
               <type>Some other type</type>
               <attribute name="second" value="def"/>
               <attribute name="phase" value="midphase"/>
            </action>
         </entryMap>
      </tag>
   </attribute>
   <attribute name="phases">
      <tag>
         <entryMap name="endphase">
            <action>
               <type>Other type</type>
               <attribute name="third" value="ghi"/>
               <attribute name="phase" value="endphase"/>
            </action>
         </entryMap>
      </tag>
   </attribute>
</root>

也就是我需要在每个phase中添加<attribute name="phase" value="entryMap name value"/>并且value属性应该包含entryMap name属性值的值。

我已经尝试并浏览了很多链接和教程,但我仍然无法实现。如果有人可以帮助我,我将非常非常感激。 提前致谢!

怎么样:

XSLT 1.0

<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:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="action">
    <xsl:copy>
        <xsl:copy-of select="*"/>
        <attribute name="phase" value="{../@name}"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

要了解其工作原理,请阅读 attribute value templates and abbreviated syntax


已添加:

is there any way by which the <attribute name="phase" value="entryMap name value"/> is added right after the <type></type> tag?

你可以这样做:

<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:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="type">
    <xsl:copy-of select="."/>
    <attribute name="phase" value="{../../@name}"/>
</xsl:template>

</xsl:stylesheet>