Получить имя тега / имя атрибута в XML с помощью XSLT
как получить имя тега и имя атрибута в 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 ответов
имя тега:
<xsl:value-of select="name(.)"/>
имя атрибута первого (!) атрибут. Если у вас больше атрибутов, вам придется выбрать другой подход
<xsl:value-of select="name(@*[1])"/>
оба выражения затем будут использоваться в шаблоне, соответствующем вашим входным элементам. например,
<xsl:template match="*">
<xsl:element name="AAA">
<!-- ... -->
</xsl:element>
</xsl:template>
вывести имя элемента или атрибута, используя один из 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>
обратите внимание, что элементы и атрибуты обрабатываются одним и тем же шаблоном.
это, вероятно, одно из самых коротких решений:
<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>