Какой самый простой способ получить отфильтрованные узлы в параметре?

#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>