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>
我是 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>