Преобразование XML в HTML: лучшая практика?
у меня есть XML, как это:
<Artist name="Syd Mead" id="3412" ntrack="28" pop="8"/>
который мне нужно использовать в разметке HTML:
<a href="#" data-name="Syd Mead" data-id="3412"
data-ntrack="28" data-pop="8"
class="pop-8"><span>Syd Mead</span></a>
что такое "правильный" способ сделать это для самого широкого спектра браузеров? Можно ли это сделать надежно с помощью преобразования XSLT? Лучше ли использовать регулярное выражение (маловероятно) или мне нужно разобрать xml, и для каждого <Artist>
тег считывает каждый атрибут и делает документ.createElement и setAttribute вручную?
на <Artist>
теги находятся в Родительском узле, есть много их. Есть ли для этого наилучшая практика?
3 ответов
это выглядит как идеальный кандидат для XSLT-XML чистый и хорошо сформированный. Если вас беспокоит совместимость браузера, почему бы не выполнить преобразование на стороне сервера?
этот XSLT преобразует ваши данные - вы можете проверить его здесь:
исходные данные:
<Artists>
<Artist name="Syd Mead" id="3412" ntrack="28" pop="8"/>
</Artists>
XSLT:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="Artists/Artist">
<a href="#">
<xsl:attribute name="data-id">
<xsl:value-of select="@id"/>
</xsl:attribute>
<xsl:attribute name="data-ntrack">
<xsl:value-of select="@ntrack"/>
</xsl:attribute>
<xsl:attribute name="data-pop">
<xsl:value-of select="@pop"/>
</xsl:attribute>
<xsl:attribute name="data-name">
<xsl:value-of select="@name"/>
</xsl:attribute>
<xsl:attribute name="class">
<xsl:value-of select="concat('pop-',@pop)"/>
</xsl:attribute>
<span><xsl:value-of select="@name"/></span>
</a>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Я не делал этого на стороне клиента, поэтому, к сожалению, я не могу говорить за совместимостью браузера.
вот простой (нет условных обозначений, нет дополнительных шаблонов, нет xsl:attribute
, нет xsl:for-each
), краткое и полное преобразование:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="no"/>
<xsl:template match="Artist">
<a href="#" data-name="{@name}"
data-id="{@id}"
data-ntrack="{@ntrack}"
data-pop="{@pop}"
class="pop-{@pop}">
<span><xsl:value-of select="@name"/></span>
</a>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному XML-документу:
<Artist name="Syd Mead" id="3412" ntrack="28" pop="8"/>
производится нужный, правильный результат:
<a href="#" data-name="Syd Mead" data-id="3412" data-ntrack="28" data-pop="8" class="pop-8"><span>Syd Mead</span></a>
объяснение: правильное использование AVT (Шаблоны значений атрибутов)
вот еще один вариант таблицы стилей XSLT, который, на мой взгляд, проще:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/*/Artist">
<a href="#" class="pop-{@pop}">
<xsl:apply-templates select="@*"/>
<span><xsl:value-of select="@name"/></span>
</a>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="data-{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
XML Input
<Artists>
<Artist name="Syd Mead" id="3412" ntrack="28" pop="8"/>
</Artists>
вывод HTML
<a class="pop-8" href="#" data-name="Syd Mead" data-id="3412" data-ntrack="28" data-pop="8">
<span>Syd Mead</span>
</a>