Какой самый простой способ получить отфильтрованные узлы в параметре? - PullRequest
0 голосов
/ 31 октября 2011

Мне интересно, каким самым простым (и наиболее дружественным к ресурсам) способом было бы преобразовать следующий пример 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 Ответ

0 голосов
/ 22 декабря 2011

Простой способ сделать это - при условии, что вы просто хотите отфильтровать английские

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...