当文本等于xslt时匹配

时间:2015-07-11 02:47:32

标签: xml xslt

我正在尝试做的事情非常简单,但我似乎无法让它发挥作用。

我有以下xml:

<analysis>
    <field>
        <name>field_1</name>
        <type>number</type>
        <tag>Number Field Number One</tag>
    </field>
    <field>
        <name>field_2</name>
        <type>text</type>
        <tag>Text Field Number One</tag>
    </field>
    <field>
        <name>field_3</name>
        <cell>A12</cell>
        <type>Excel</type>
        <tag>Value that comes from an Excel file</tag>
    </field>
</analysis>

我希望XML输出:

<table>
    <thead>
        <tr>
            <th>Nombre</th> // Name in spanish
            <th>Tipo</th>   // Type in spanish
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Number Field Number One</td>
            <td>Número</td>  // Number in spanish
        </tr>
        <tr>
            <td>Text Field Number One</td>
            <td>Campo de Texto</td>  // Text field in spanish
        </tr>
        <tr>
            <td>Value that comes from an Excel file</td>
            <td>Excel (A12)</td>  // Excel (cell)
        </tr>
    </tbody>
</table>

到目前为止我的转型是下一个:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:output method="html" indent="yes"/>

    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="analysis">

        <table>
            <thead>
                <tr>
                    <th>Nombre</th>
                    <th>Tipo</th>
                </tr>
            </thead>
            <tbody>
                <xsl:apply-templates select="field[type != 'table']"/>
                <!-- I have another type called table which I'm ignoring for this question and won't follow the same scheme -->
            </tbody>
        </table>

        <br />

    </xsl:template>

    <xsl:template match="campo[field != 'table']">

        <tr>
            <td>
                <xsl:value-of select="tag" />
            </td>
            <td>
                <xsl:apply-templates select="type"/>
            </td>
        </tr>

    </xsl:template>

    <!-- The following templates don't match -->

    <xsl:template select="type = 'Excel'">
        <xsl:param name="cell" select="preceding-sibling::node()/cell" />
        <xsl:value-of select="concat('Excel ', $cell)" />
    </xsl:template>

    <xsl:template select="type = 'number'">
        <xsl:value-of select="'Número'" />
    </xsl:template>

    <xsl:template select="type = 'text'">
        <xsl:value-of select="'Campo de Texto'" />
    </xsl:template>

</xsl:stylesheet>

正如代码所说,最后的模板不匹配。如果标签的文本等于某个标签,我如何匹配标签?我的输出是我想要的,但使用'数字','文本'和'Excel'值而不是西班牙语中的等价物,这就是我想要的。

我尝试了<xsl:template select="field[type = 'Excel']">之类的其他内容,但效果相同。

1 个答案:

答案 0 :(得分:1)

  

&#34;如果标签的文字等于某个标签,我如何匹配标签?&#34;

关注在元素的文本等于特定值时匹配元素的具体问题,您可以使用引用当前上下文元素的.来实现该元素。匹配&#39;任务,例如:

<xsl:template match="type[.='text']">
    <xsl:value-of select="'Campo de Texto'" />
</xsl:template>