使用XSLT以XML格式获取标记名称/属性名称

时间:2011-12-15 15:11:55

标签: xml xslt tags

在XML中获取标记名称和属性名称的方法是什么?

如果我有这样的XML文件:

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

我的XSLT文件的一部分如下:

<xsl:element name="AAA">
<???>
</xsl:element>

那么我应该在???部分写什么,这样我才能得到这样的输出:

对于标签名称:

<AAA>apple</AAA>
<AAA>banana</AAA>
<AAA>sugar</AAA>
<AAA>cat</AAA>

对于属性名称:

<AAA>color</AAA>
<AAA>color</AAA>
<AAA>taste</AAA>
<AAA>size</AAA>

3 个答案:

答案 0 :(得分:12)

标记名称:

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

第一个(!)属性的属性名称。如果您有更多属性,则必须选择不同的方法

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

然后,两个表达式将用于匹配输入元素的模板中。 e.g。

<xsl:template match="*">
  <xsl:element name="AAA">
    <!-- ... -->
  </xsl:element>
</xsl:template>

答案 1 :(得分:3)

使用name()local-name()之一输出元素或属性的名称:

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

假设本文件:

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

然后这个样式表:

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

产地:

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

请注意,元素和属性都由同一模板处理。

答案 2 :(得分:3)

这可能是最简短的解决方案之一

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

将此转换应用于以下XML文档(将您的片段包装到顶部元素中):

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

产生了想要的正确结果

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