У меня есть серия XML-документов среднего размера, которые в основном представляют собой текст с несколькими узлами, представляющими макросы, подлежащие расширению, например ::10000
<foo>Some text <macro>A1</macro> ... <macro>B2</macro> ...etc...</foo>
Моя цель - заменить каждый макрос на соответствующий XML. Обычно это один тег <img>
с разными атрибутами, но это может быть и другой HTML.
Таблица стилей генерируется программно, и один из способов сделать это - иметь шаблон для каждого макроса, например
<xsl:template match="macro[.='A1']">
<!-- content goes here -->
</xsl:template>
<xsl:template match="macro[.='A2']">
<!-- other content goes here -->
</xsl:template>
<xsl:template match="macro[.='B2']">
<!-- etc... -->
</xsl:template>
Работает просто отлично, но может иметь до ста макросов и не очень производительно (я использую libxslt.) Я попробовал пару альтернатив, таких как:
<xsl:template match="macro">
<xsl:choose>
<xsl:when test=".='A1'">
<!-- content goes here -->
</xsl:when>
<xsl:when test=".='A2'">
<!-- other content goes here -->
</xsl:when>
<xsl:when test=".='B2'">
<!-- etc... -->
</xsl:when>
</xsl:choose>
</xsl:template>
Это немного более производительно. Я попытался добавить еще один уровень ветвления, например:
<xsl:template match="macro">
<xsl:choose>
<xsl:when test="substring(.,1,1) = 'A'">
<xsl:choose>
<xsl:when test=".='A1'">
<!-- content goes here -->
</xsl:when>
<xsl:when test=".='A2'">
<!-- other content goes here -->
</xsl:when>
</xsl:choose>
</xsl:when>
<xsl:when test=".='B2'">
<!-- etc... -->
</xsl:when>
</xsl:choose>
</xsl:template>
Он загружается немного медленнее (XSL больше и немного сложнее), но работает немного быстрее (каждая ветвь может исключить несколько случаев.)
Теперь мне интересно, есть ли лучший способ сделать это? У меня около 50-100 макросов. Обычно преобразование выполняется с использованием libxslt, но я не могу использовать проприетарные расширения других движков XSLT.
Любые входные данные приветствуются:)