使用xslt节点作为标记转换xml,将text作为值转换

时间:2011-08-12 09:30:06

标签: xml xslt

我想转换xml,那个:

  • 标签是当前节点的名称(这是我自己创造的)
  • 节点之间的值是我的新标签之下
  • 这是我的代码:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <IDataXMLCoder version="1.0">
      <record javaclass="xxx">
        <record name="result" javaclass="yyy">
          <value name="errorCode">0</value>
          <value name="errorDesc">OK</value>
        </record>
      </record>
    </IDataXMLCoder>
    

    我想转换成类似的东西:

    <IDataXMLCoder>
        <record>
            <result>
                <errorCode>0</errorCode>
                <errorDesc>OK</errorDesc>
            </result>
        </record>
    </IDataXMLCoder>
    

    如您所见,

    name="errorCode"
    现在是节点的名称。这个节点的值是
    0
    我到目前为止写的代码:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output omit-xml-declaration="no" indent="yes"/>
        <!--<xsl:strip-space elements="*"/>--> <!--po usunieciu nie bedzie wciec-->
    
        <xsl:template match="node()|@*">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*"/>
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match=
                              "*/@*[contains('|javaclass|version|',
                          concat('|',name(),'|')
                          )
                ]"/>
        <xsl:template match="@*">
            <xsl:element name="{current()}">
                <xsl:value-of select="."/>
            </xsl:element>
        </xsl:template>
    
    </xsl:stylesheet>
    

    我明白了:

    <IDataXMLCoder>
      <record>
        <record>
    <result>result</result>
          <value>
    <errorCode>errorCode</errorCode>0</value>
          <value>
    <errorDesc>errorDesc</errorDesc>OK</value>
        </record>
      </record>
    </IDataXMLCoder>
    

    那么,我怎么能把它变成我想要的呢?谢谢,任何帮助。

    1 个答案:

    答案 0 :(得分:2)

    以下是一个样本样式表,它可以实现所发布的输入样本的描述结果:

    <xsl:stylesheet
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      version="1.0">
    
      <xsl:template match="@* | node()">
        <xsl:copy>
          <xsl:apply-templates/>
        </xsl:copy>
      </xsl:template>
    
      <xsl:template match="*[@name]">
        <xsl:element name="{@name}">
          <xsl:apply-templates/>
        </xsl:element>
      </xsl:template>
    
    </xsl:stylesheet>
    

    如果这还不够,那么您需要更详细地解释您的要求。