XSLT无法获取xml子元素

时间:2014-05-22 10:38:25

标签: c# xml xslt

我有以下xsl样式表和xml但是我无法在xsl模板中获取xml父节点中的元素匹配不起作用,我无法从xml获取表和costumer节点

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

    <xsl:template match="/">
        <HTML>
            <HEAD>
                <TITLE>Title</TITLE>
            </HEAD>
            <BODY>
                <xsl:apply-templates/>
            </BODY>
        </HTML>
    </xsl:template>

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

    <xsl:template match="costumer">
        <p>Costumer</p>
    </xsl:template>

    <xsl:template match="table">
        <xsl:variable name="name" select="@name"/>
        <xsl:variable name="type" select="@type"/>
        <xsl:variable name="height" select="@height"/>
        <xsl:variable name="width" select="@wdth"/>
        <xsl:variable name="margin-top" select="@margin-top"/>
        <xsl:variable name="margin-left" select="@margin-left"/>
        <table id="{$name}" width="{$width}" height="{$height}" style="margin-top:{$margin-top}; margin-left:{$margin-left}">
            <thead>
                <tr>
                    <xsl:apply-templates select="*[1]/*" mode="th"/>
                </tr>
            </thead>
            <tbody>
                <xsl:apply-templates select="*"/>
            </tbody>
        </table>
    </xsl:template>

    <xsl:template match="/*/*/*" mode="th">
        <th>
            <xsl:value-of select="*"/>
        </th>
    </xsl:template>

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

    <xsl:template match="/*/*/*">
        <xsl:variable name="texttd" select="@text"/>
        <td>
            <xsl:value-of select="$texttd"/>
        </td>
    </xsl:template>
</xsl:stylesheet>

以下是xml文件

<?xml version="1.0" encoding="utf-8"?>
<parent>
    <table name="region1" type="td" wdth="0" height="0" margin-top="1" margin-left="122">
        <td margin-top="0" margin-left="152" width="36" height="13" font-family="Arial-BoldMT" font-size="16" font-weight="0" text="??&quot;?" line-height="300" is-visible="True" color="#0A4462" />
        <Text name="region1" type="Title" wdth="0" height="0" margin-top="7" margin-left="138">
            <Title margin-top="0" margin-left="14" width="36" height="13" font-family="Arial-BoldMT" font-size="16" font-weight="0" text="??&quot;?" line-height="300" is-visible="True" color="#0A4462" />
        </Text>
    </table>
    <table name="region1" type="td" wdth="0" height="0" margin-top="1" margin-left="122">
        <td margin-top="0" margin-left="152" width="36" height="13" font-family="Arial-BoldMT" font-size="16" font-weight="0" text="??&quot;?" line-height="300" is-visible="True" color="#0A4462" />
        <Text name="region1" type="Title" wdth="0" height="0" margin-top="7" margin-left="138">
            <Title margin-top="0" margin-left="14" width="36" height="13" font-family="Arial-BoldMT" font-size="16" font-weight="0" text="??&quot;?" line-height="300" is-visible="True" color="#0A4462" />
        </Text>
    </table>
    <table name="region1" type="td" wdth="0" height="0" margin-top="1" margin-left="122">
        <td margin-top="0" margin-left="152" width="36" height="13" font-family="Arial-BoldMT" font-size="16" font-weight="0" text="??&quot;?" line-height="300" is-visible="True" color="#0A4462" />
        <Text name="region1" type="Title" wdth="0" height="0" margin-top="7" margin-left="138">
            <Title margin-top="0" margin-left="14" width="36" height="13" font-family="Arial-BoldMT" font-size="16" font-weight="0" text="??&quot;?" line-height="300" is-visible="True" color="#0A4462" />
        </Text>
    </table>
    <costumer></costumer>
    <costumer></costumer>
</parent>

1 个答案:

答案 0 :(得分:1)

<xsl:template match="/*/*/*" >等通用模板获得更高的优先级。似乎表达式中的斜杠数/计入优先级。

我认为你应该通过使XPath更具体来提高你想要的模板的优先级

<xsl:template match="/parent/table">
<xsl:template match="/parent/costumer">

这仍然不适用于costumer,因此您需要将其移至样式表的末尾,因为在优先级相同的情况下,最后的项目是首选。

您还可以明确地降低通用项目的优先级,如下所示:

<xsl:template match="/*/*/*" priority="-1">

作为替代方案,您可以明确增加所需项目的优先级:

<xsl:template match="table" priority="5">

其他我需要完整的预期输出,看看是否所有这些都有助于构建您正在寻找的解决方案。

顺便说一句:我想你想要客户而不是客户