如何使用XSL转换XML标签

时间:2018-10-17 09:08:52

标签: xml xslt

我需要使用xsl文件转换xml,问题是:我有几个具有相同名称但属性不同的标记,我必须将其转换为使用其属性名称更改其名称并打印其值。 这里是示例:

<INDEX_FIELDS>
  <FIELD NAME= "Field1" VALUE= "value1"/>
  <FIELD NAME= "Field2" VALUE= "value2"/>
  <FIELD NAME= "Field3" VALUE= "value3"/>
  <FIELD NAME= "Field4" VALUE= "value4"/>
</INDEX_FIELDS>

我想像这样的示例:

<INDEX_FIELD>
  <FIELD1>VALUE1</FIELD1>
  <FIELD2>VALUE2</FIELD2>
  <FIELD3>VALUE3</FIELD3>
  <FIELD4>VALUE4</FIELD4>
</INDEX_FIELD>

我只能使用xsl转换。有人可以给我任何帮助吗?我已经访问了W3C学校站点,尝试了几种方法,但是似乎没有任何效果。感谢任何人都会回答。

这是我的xslt:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" version="1.0">
  <xsl:strip-space elements="*"/>
  <xsl:template match="/">
  <ROOT>
   <HEAD>
    <TAG><xsl_value-of select="ROOT/HEAD/TAG"/></TAG>
     <-- Several tag -->
    </HEAD>
    <BODY>
    <DOCUMENTS><--Here it is a list of documents -->
    <xsl:for-each select="ROOT/BODY/DOCUMENTS/DOCUMENT">
    <DOCUMENT>
     <xsl:for-each select="INDEX_FIELDS/FIELD">
    enter code here
     </xsl:for-each>
    <-- Closing tags --> 

2 个答案:

答案 0 :(得分:1)

<xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="FIELD">
        <xsl:element name="{@NAME}">
            <xsl:value-of select="@VALUE"/>
        </xsl:element>
    </xsl:template>
Try it.

答案 1 :(得分:0)

不需要使用for-each循环。 您还可以使用与XML文档的一部分匹配的xsl:template match规则。每当XML中出现匹配项时,就会执行此规则

构建XSLT的替代方法:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" version="1.0">
  <xsl:strip-space elements="*"/>
  <xsl:template match="/">
  <ROOT>
   <HEAD>
    <TAG><xsl_value-of select="ROOT/HEAD/TAG"/></TAG>
     <-- Several tag -->
    </HEAD>
    <BODY>
    <DOCUMENTS>
        <xsl:apply-templates match="DOCUMENT"/>--this tells the XSLT processor to find all DOCUMENT nodes and process them. 
    <-- Closing tags --> 
....
<xsl:template match="DOCUMENT">
    <DOCUMENT>
        process your Document nodes here
        <xsl:apply-templates/> --this makes sure the subnodes in the DOCUMENT node are processed. 
    </DOCUMENT>
</xsl:template>
....
<xsl:template match="FIELD">
    <xsl:element name="{@NAME}">
        <xsl:value-of select="@VALUE"/>
    </xsl:element>
</xsl:template>

XSLT教程: http://edutechwiki.unige.ch/en/XSLT_Tutorial_-_Basics#A_first_glance_at_XSLT

XSLT与许多编程语言的工作方式略有不同:您可以在源文档中指定可能节点的列表以及如何处理它们,而不是使用带有子例程等的指令列表。