Get tag name/attribute name in XML using XSLT

后端 未结 3 1453
没有蜡笔的小新
没有蜡笔的小新 2021-01-05 02:20

What\'s the way to get a tag name and attribute name in XML?

If I have a XML file like this:





        
相关标签:
3条回答
  • 2021-01-05 02:47

    Tag name:

    <xsl:value-of select="name(.)"/>
    

    Attribute name of the first (!) attribute. If you have more attributes, you'd have to choose a different approach

    <xsl:value-of select="name(@*[1])"/>
    

    Both expressions would then be used in a template matching your input elements. e.g.

    <xsl:template match="*">
      <xsl:element name="AAA">
        <!-- ... -->
      </xsl:element>
    </xsl:template>
    
    0 讨论(0)
  • 2021-01-05 02:49

    This is probably one of the shortest solutions:

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="*/*|@*">
      <AAA>
       <xsl:value-of select="name()"/>
      </AAA>
       <xsl:apply-templates select="@*"/>
     </xsl:template>
    </xsl:stylesheet>
    

    when this transformation is applied on the following XML document (your fragment wrapped into a top element):

    <things>
        <apple color="red"/>
        <banana color="yellow"/>
        <sugar taste="sweet"/>
        <cat size="small"/>
    </things>
    

    the wanted, correct result is produced:

    <AAA>apple</AAA>
    <AAA>color</AAA>
    <AAA>banana</AAA>
    <AAA>color</AAA>
    <AAA>sugar</AAA>
    <AAA>taste</AAA>
    <AAA>cat</AAA>
    <AAA>size</AAA>
    
    0 讨论(0)
  • 2021-01-05 02:52

    Output the name of an element or attribute using one of name() or local-name():

    <xsl:value-of select="name()"/>
    <xsl:value-of select="local-name()"/>
    

    Assume this document:

    <root>
        <apple color="red"/>
        <banana color="yellow"/>
        <sugar taste="sweet"/>
        <cat size="small"/>
    </root>
    

    Then this stylesheet:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
        <xsl:template match="/">
            <root>
                <xsl:apply-templates select="/*/*"/>
                <xsl:apply-templates select="/*/*/@*"/>
            </root>
        </xsl:template>
        <xsl:template match="*|@*">
            <AAA><xsl:value-of select="local-name()"/></AAA>
        </xsl:template>
    </xsl:stylesheet>
    

    Produces:

    <root>
       <AAA>apple</AAA>
       <AAA>banana</AAA>
       <AAA>sugar</AAA>
       <AAA>cat</AAA>
       <AAA>color</AAA>
       <AAA>color</AAA>
       <AAA>taste</AAA>
       <AAA>size</AAA>
    </root>
    

    Notice that both elements and attributes are handled by the same template.

    0 讨论(0)
提交回复
热议问题