#xslt
#xslt
Вопрос:
Мне интересно, каким самым простым (и наиболее ресурсоемким) способом было бы преобразовать следующий пример XML
<index>
<element_1>
<local xml:lang="en">Something in English</local>
<local xml:lang="bg">Something in Bulgarian</local>
<local xml:lang="cs">Something in Czech</local>
<!-- more locales from here -->
</element_1>
<element_2>
<local xml:lang="en">Something else in English</local>
<local xml:lang="bg">Something else in Bulgarian</local>
<local xml:lang="cs">Something else in Czech</local>
<!-- more locales from here -->
</element_2>
<!-- more elements from here -->
</index>
В следующий XML, чтобы я мог сохранить его в параметре
<index>
<element_1>Something in English</element_1>
<element_2>Something else in English</element_2>
<!-- more elements from here -->
</index>
Я знаю, что приведенный ниже xslt делает свое дело, но поскольку мои фактические файлы намного больше и сложнее, чем в приведенном выше примере, мне было интересно, есть ли более простые способы добиться этого. Например, используя XPath вместо шаблона. Какие-либо рекомендации?
<xsl:param name="indexNode" select="/index"/>
<xsl:param name="language">en</xsl:param>
<xsl:template match="/">
<xsl:for-each select="$indexNode">
<xsl:copy>
<!-- index node -->
<xsl:for-each select="node()">
<!-- element node -->
<xsl:copy>
<!-- locale node -->
<xsl:value-of select="local[lang($language)]"/>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:for-each>
</xsl:template>
Заранее спасибо!
Ответ №1:
Простой способ сделать это — предполагая, что вы просто хотите отфильтровать английские узлы
<xsl:template match="/">
<index>
<xsl:for-each select="//local[@xml:lang='en']">
<xsl:element select="local-name(parent::*)"> //Get name of parent and create a node
<xsl:value-of select="."/>
</xsl>
</xsl:for-each>
</index>
</xsl:template>