Я хочу создать HTML-файл, подобный этому примеру:
Английский
En Lorem ipsum dolor sit amet, consitteur adipiscing elit.
Nunc Rutrum, Eros Sit Amet Ornare Faucibus.
Français
Fr Lorem Ipsum Dolor Sit Amet, Concetetur Adipiscing Elit.
Nunc Rutrum, Eros Sitamet ornare faucibus.
Из следующего примера источника XML, над которым у меня нет контроля:
<?xml version="1.0" encoding="ISO-8859-1"?>
<content id="">
<header language="en">
<enabled>true</enabled>
<img src="http://i.stack.imgur.com/xGCNw.gif" />
<!-- more header-related elements -->
</header>
<header language="fr">
<enabled>false</enabled>
<img src="" />
<!-- more header-related elements -->
</header>
<html language="en" type="source">
<![CDATA[
<p>En Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>Nunc rutrum, eros sit amet ornare faucibus.</p>
]]>
</html>
<html language="fr" type="source">
<![CDATA[
<p>Fr Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>Nunc rutrum, eros sit amet ornare faucibus.</p>
]]>
</html>
</content>
Итак, я написал этот XSLT для этого:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<h1>English</h1>
<hr/>
<xsl:for-each select="content/header">
<xsl:call-template name="header">
<xsl:with-param name="lang">en</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
<xsl:for-each select="content/html">
<xsl:call-template name="html">
<xsl:with-param name="lang">en</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
<hr/>
<h1>Français</h1>
<hr/>
<xsl:for-each select="content/header">
<xsl:call-template name="header">
<xsl:with-param name="lang">fr</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
<xsl:for-each select="content/html">
<xsl:call-template name="html">
<xsl:with-param name="lang">fr</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<xsl:template name="header" match="*">
<xsl:param name='lang'/>
<xsl:if test="current()[@language=$lang]">
<xsl:if test="enabled[normalize-space(text())='true']">
<xsl:call-template name="image"/>
<!-- more header-related elements -->
</xsl:if>
</xsl:if>
</xsl:template>
<xsl:template name="image" match="*">
<xsl:if test="img[not(normalize-space(@src)='')]">
<xsl:copy-of select="img"/>
</xsl:if>
</xsl:template>
<xsl:template name="html" match="*">
<xsl:param name='lang'/>
<xsl:if test="current()[@language=$lang]">
<xsl:value-of select="node()" disable-output-escaping="yes" />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Тем не менее, мое решение кажется очень многословным, но, похоже, оно позволяет использовать полезные свойства композиции и повторного использования, что очень важно для меня, поскольку мне нужно будет преобразовать множество документов XML, структура которых аналогична этому примеру;и, таким образом, если большинство моих XSLT могут повторно использовать части других XSLT, это будет очень полезно.
Несколько примечаний, представляющих интерес:
- Преобразование скорость не имеет значения, хотя было бы интересно узнать больше об этом аспекте.
- Преобразования никогда не потребуются для обработки XML-документов, которые кодируют более двух примеров языков (ru и fr ).
Поэтому я хотел бы узнать, выглядит ли мое решение анти-идиоматическим или даже совершенно неверным для вас, спорщики XSLT.