在参数中获取过滤节点的最简单方法是什么?

时间:2011-10-31 09:46:33

标签: 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 个答案:

答案 0 :(得分:0)

这样做的一种简单方法 - 假设您只想过滤掉英文版

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