首页 > 解决方案 > 通过 XPath 提取元素节点的值?

问题描述

源 XML:

<data>
    <item>
        <values>
            <element1>
                <language>EN</language>
                <text>text</text>
            </element1>
            <element2>
                <language>DE</language>
                <text>Text</text> 
            </element2>
        </values>
    </item>
    <item>
        <values>
            <element5>
                <language>EN</language>
                <text>description</text>
            </element5>
            <element6>
                <language>DE</language>
                <text>Beschreibung</text> 
            </element6>
        </values>
    </item> </data>

我想获得语言“EN”中的所有元素。首先我有一个循环,我将元素名称保存在一个变量中。在下一步中,我只想获取语言“EN”中的元素。在此步骤的结果中,我只需要具有语言“EN”的元素名称和文本来构建表格。

我试过这个:

<xsl:param name="element" select="'element1'"/>  
<xsl:template match="/">
    <xsl:if test="data/item/values[local-name()=$element]/language[text()='EN']">

    </xsl:if>
</xsl:template>

输出 XSLT 应该是这样的:

 <table id="123">   
        <tgroup cols="2">
            <colspec colname="c1" colnum="1" colwidth="1.0*"/>
            <colspec colname="c2" colnum="2" colwidth="1.0*"/>
            <thead>
                <row>
                    <entry>Name</entry>
                    <entry>Values</entry>
                </row>
            </thead>
            <tbody>
                <row>
                    <entry>
                        <ph>element1</ph>
                    </entry>
                    <entry>text</entry>
                </row>
                <row>
                    <entry>
                        <ph>element5</ph>
                    </entry>
                    <entry>description</entry>
                </row>
            </tbody>
        </tgroup>
    </table>

我知道还有其他方法可以解决这个问题。但是对于转换中的其他步骤,重要的是分别测试每个元素。

提前致谢!

标签: xsltxpath

解决方案


<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
            xmlns:exsl="http://exslt.org/common" version="1.0">

<xsl:output indent="yes" />
<xsl:strip-space elements="*" />

<xsl:template match="/">
    <xsl:variable name="ENelements">
        <xsl:for-each select="/data/item/values/*[language='EN']">
           <element name="{local-name()}"><xsl:value-of select="text" /></element>
        </xsl:for-each>
    </xsl:variable>

    <table id="123">   
        <tgroup cols="2">
            <colspec colname="c1" colnum="1" colwidth="1.0*"/>
            <colspec colname="c2" colnum="2" colwidth="1.0*"/>
            <thead>
                <row>
                    <entry>Name</entry>
                    <entry>Values</entry>
                </row>
            </thead>
            <tbody>
                <xsl:for-each select="exsl:node-set($ENelements)/*">
                     <row>
                        <entry>
                            <ph><xsl:value-of select="@name" /></ph>
                        </entry>
                        <entry><xsl:value-of select="." /></entry>
                    </row>
                </xsl:for-each>
            </tbody>
        </tgroup>
    </table>
</xsl:template>

</xsl:stylesheet>

http://xsltfiddle.liberty-development.net/jyRYYig


推荐阅读