2011-12-15 4 views
7

Каков способ получить имя тега и имя атрибута в XML?Получить имя тега/имя атрибута в XML с помощью XSLT

Если у меня есть 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> 
+0

Можете ли вы показать нам, что вы пробовали до сих пор? И для записи ваш пример не является допустимым XML-файлом. – larsks

+0

Это весь XML-документ? Это неверно. Можете ли вы показать больше контекста? –

ответ

10

имя Метка:

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

Атрибут имя первого атрибута (!). Если у вас есть дополнительные атрибуты, вы должны выбрать другой подход

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

Оба выражения будут затем использоваться в качестве шаблона, соответствующего вашим входных элементов. например

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

Спасибо! Он отлично работает – ahliang1412

+1

@_Lucas Eder: '' может быть правильно записано как: ''.Для выражения соответствия абсолютное значение бессмысленно и в очень немногих случаях состоит из нескольких позиций. –

+0

@DimitreNovatchev: Вы правы, спасибо –

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> 

Обратите внимание, что оба элемента и атрибуты обрабатываются одним и тем же шаблоном.

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> 
Смежные вопросы