Получить имя тега / атрибута в XML с помощью XSLT - PullRequest
8 голосов
/ 15 декабря 2011

Как можно получить имя тега и имя атрибута в 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 ]

13 голосов
/ 15 декабря 2011

Имя тега:

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

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

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

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

<xsl:template match="*">
  <xsl:element name="AAA">
    <!-- ... -->
  </xsl:element>
</xsl:template>
3 голосов
/ 15 декабря 2011

Вероятно, это одно из самых коротких решений :

<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>
3 голосов
/ 15 декабря 2011

Вывод имени элемента или атрибута с использованием одного из 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>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...