XSL应用模板不起作用...可能是XPath错误

时间:2010-04-23 12:44:21

标签: xslt xpath apply-templates

我已经将mny样式表转换为使用应用模板而不是调用模板,它适用于我的其他styesheet,这更复杂,但是这个似乎不起作用,甚至认为它是一个更简单的模板。

它输出的所有内容都是性别节点和用户级节点。我认为这与我的Xpath有关。

我想要的只是输出<用户>信息,没有别的

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

    <xsl:template name="hoo" match="/">
        <html>
            <head>
                <title>Registered Members</title>
                <link rel="stylesheet" type="text/css" href="user.css" />
            </head>
            <body>
                <h1>Registered Members</h1>
                <xsl:for-each select="folktask/member/user">

                    <div class="userdiv">

                        <xsl:apply-templates/>

                    </div>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="folktask/member/user">
        <xsl:apply-templates select="@id"/>
        <xsl:apply-templates select="personal/name"/>
        <xsl:apply-templates select="personal/address1"/>
        <xsl:apply-templates select="personal/city"/>
        <xsl:apply-templates select="personal/county"/>
        <xsl:apply-templates select="personal/postcode"/>
        <xsl:apply-templates select="personal/telephone"/>
        <xsl:apply-templates select="personal/mobile"/>
        <xsl:apply-templates select="personal/email"/>
        <xsl:apply-templates select="personal"/>
        <xsl:apply-templates select="account/username"/>
        <xsl:apply-templates select="account"/>
    </xsl:template>

    <xsl:template match="@id">
        <div class="heading bold"><h2>USER ID: <xsl:value-of select="." /></h2></div>
    </xsl:template>

    <xsl:template match="personal/name">
        <div class="small bold">NAME:</div> 
        <div class="large"><xsl:value-of select="." /></div>
    </xsl:template>

    <xsl:template match="personal/address1">
        <div class="small bold">ADDRESS:</div>
        <div class="large"><xsl:value-of select="." /></div>
    </xsl:template>

    <xsl:template match="personal/city">
        <div class="small bold">CITY:</div>
        <div class="large"><xsl:value-of select="." /></div>
    </xsl:template>

    <xsl:template match="personal/county">
        <div class="small bold">COUNTY:</div>
        <div class="large"><xsl:value-of select="." /></div>
    </xsl:template>

    <xsl:template match="personal/postcode">
        <div class="small bold">POSTCODE:</div>
        <div class="large"><xsl:value-of select="." /></div>
    </xsl:template>

    <xsl:template match="personal/telephone">
        <div class="small bold">TELEPHONE:</div>
        <div class="large"><xsl:value-of select="." /></div>
    </xsl:template>

    <xsl:template match="personal/mobile">
        <div class="small bold">MOBILE:</div>
        <div class="large"><xsl:value-of select="." />
        </div>
    </xsl:template>

    <xsl:template match="personal/email">
        <div class="small bold">EMAIL:</div>
        <div class="large">
            <xsl:element name="a">
                <xsl:attribute name="href">
                    <xsl:text>mailto:</xsl:text>
                    <xsl:value-of select="." />
                </xsl:attribute>
                <xsl:value-of select="." />
            </xsl:element>
        </div>
    </xsl:template>

    <xsl:template match="personal">
    <div class="small bold">SEX:</div>
    <div class="colored bold">
        <xsl:choose>
            <xsl:when test="sex='Male'">
                <div class="sex male"><xsl:value-of select="sex/."/></div>
            </xsl:when>
            <xsl:otherwise>
                <div class="sex female"><xsl:value-of select="sex/."/></div>
            </xsl:otherwise>
        </xsl:choose>
    </div>
    </xsl:template>

    <xsl:template match="account/username">
        <div class="small bold">USERNAME:</div>
        <div class="large"><xsl:value-of select="." /></div>
    </xsl:template>


    <xsl:template match="account">
        <div class="small bold">ACCOUNT TYPE:</div>
        <div class="colored ">
        <xsl:choose>
            <xsl:when test="userlevel='1'">
                <div class="nml bold">Normal User</div>
            </xsl:when>

            <xsl:when test="userlevel='2'">
                <div class="vol bold">Volunteer</div>
            </xsl:when>

            <xsl:when test="userlevel='3'">
                <div class="org bold">Organiser</div>
            </xsl:when>

            <xsl:otherwise>
                <div class="name adm bold">Administrator</div>
            </xsl:otherwise>
        </xsl:choose>
        </div>
    </xsl:template>

</xsl:stylesheet> 

和我的一些xml

<?xml version="1.0" encoding="ISO-8859-1" ?>
<?xml-stylesheet type="text/xsl" href="users.xsl"?>
<folktask xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="folktask.xsd">
    <member>
        <user id="1">
            <personal>
                <name>Abbie Hunt</name>
                <sex>Female</sex>
                <address1>108 Access Road</address1>
                <address2></address2>
                <city>Wells</city>
                <county>Somerset</county>
                <postcode>BA5 8GH</postcode>
                <telephone>01528927616</telephone>
                <mobile>07085252492</mobile>
                <email>adrock@gmail.com</email>
            </personal>
            <account>
                <username>AdRock</username>
                <password>269eb625e2f0cf6fae9a29434c12a89f</password>
                <userlevel>4</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
        <volunteer id="1">
            <roles></roles>
            <region>South West</region>
        </volunteer>
    </member>
    <member>
        <user id="2">
            <personal>
                <name>Aidan Harris</name>
                <sex>Male</sex>
                <address1>103 Aiken Street</address1>
                <address2></address2>
                <city>Chichester</city>
                <county>Sussex</county>
                <postcode>PO19 4DS</postcode>
                <telephone>01905149894</telephone>
                <mobile>07784467941</mobile>
                <email>ambientexpert@yahoo.co.uk</email>
            </personal>
            <account>
                <username>AmbientExpert</username>
                <password>8e64214160e9dd14ae2a6d9f700004a6</password>
                <userlevel>2</userlevel>
                <signupdate>2010-03-26T09:23:50</signupdate>
            </account>
        </user>
        <volunteer id="2">
            <roles>Van Driver,gas Fitter</roles>
            <region>South Central</region>
        </volunteer>
    </member>
</folktask>

2 个答案:

答案 0 :(得分:3)

问题在于此代码

   <xsl:for-each select="folktask/member/user">

        <div class="userdiv">

            <xsl:apply-templates/>

        </div>
    </xsl:for-each>

这会将模板应用于当前user元素的所有子元素 - 而不是user元素。

结果,未选择匹配user的模板。

user的孩子是personalaccount

选择与这些元素匹配的模板,然后生成它们的输出。

解决方案:需要进行一些清理工作,但第一个明显的步骤是将上述代码替换为:

        <xsl:apply-templates select="folktask/member/user"/>

您还必须将div从已删除的<xsl:for-each>正文移动到与folktask/member/user匹配的模板中。

更正后的XSLT代码为:

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

    <xsl:template name="hoo" match="/">
        <html>
            <head>
                <title>Registered Members</title>
                <link rel="stylesheet" type="text/css" href="user.css" />
            </head>
            <body>
                <h1>Registered Members</h1>
                <xsl:apply-templates select="folktask/member/user"/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="folktask/member/user">
        <div class="userdiv">
            <xsl:apply-templates select="@id"/>
            <xsl:apply-templates select="personal/name"/>
            <xsl:apply-templates select="personal/address1"/>
            <xsl:apply-templates select="personal/city"/>
            <xsl:apply-templates select="personal/county"/>
            <xsl:apply-templates select="personal/postcode"/>
            <xsl:apply-templates select="personal/telephone"/>
            <xsl:apply-templates select="personal/mobile"/>
            <xsl:apply-templates select="personal/email"/>
            <xsl:apply-templates select="personal"/>
            <xsl:apply-templates select="account/username"/>
            <xsl:apply-templates select="account"/>
        </div>
    </xsl:template>

    <xsl:template match="@id">
        <div class="heading bold"><h2>USER ID: <xsl:value-of select="." /></h2></div>
    </xsl:template>

    <xsl:template match="personal/name">
        <div class="small bold">NAME:</div>
        <div class="large"><xsl:value-of select="." /></div>
    </xsl:template>

    <xsl:template match="personal/address1">
        <div class="small bold">ADDRESS:</div>
        <div class="large"><xsl:value-of select="." /></div>
    </xsl:template>

    <xsl:template match="personal/city">
        <div class="small bold">CITY:</div>
        <div class="large"><xsl:value-of select="." /></div>
    </xsl:template>

    <xsl:template match="personal/county">
        <div class="small bold">COUNTY:</div>
        <div class="large"><xsl:value-of select="." /></div>
    </xsl:template>

    <xsl:template match="personal/postcode">
        <div class="small bold">POSTCODE:</div>
        <div class="large"><xsl:value-of select="." /></div>
    </xsl:template>

    <xsl:template match="personal/telephone">
        <div class="small bold">TELEPHONE:</div>
        <div class="large"><xsl:value-of select="." /></div>
    </xsl:template>

    <xsl:template match="personal/mobile">
        <div class="small bold">MOBILE:</div>
        <div class="large"><xsl:value-of select="." />
        </div>
    </xsl:template>

    <xsl:template match="personal/email">
        <div class="small bold">EMAIL:</div>
        <div class="large">
            <xsl:element name="a">
                <xsl:attribute name="href">
                    <xsl:text>mailto:</xsl:text>
                    <xsl:value-of select="." />
                </xsl:attribute>
                <xsl:value-of select="." />
            </xsl:element>
        </div>
    </xsl:template>

    <xsl:template match="personal">
    <div class="small bold">SEX:</div>
    <div class="colored bold">
        <xsl:choose>
            <xsl:when test="sex='Male'">
                <div class="sex male"><xsl:value-of select="sex/."/></div>
            </xsl:when>
            <xsl:otherwise>
                <div class="sex female"><xsl:value-of select="sex/."/></div>
            </xsl:otherwise>
        </xsl:choose>
    </div>
    </xsl:template>

    <xsl:template match="account/username">
        <div class="small bold">USERNAME:</div>
        <div class="large"><xsl:value-of select="." /></div>
    </xsl:template>


    <xsl:template match="account">
        <div class="small bold">ACCOUNT TYPE:</div>
        <div class="colored ">
        <xsl:choose>
            <xsl:when test="userlevel='1'">
                <div class="nml bold">Normal User</div>
            </xsl:when>

            <xsl:when test="userlevel='2'">
                <div class="vol bold">Volunteer</div>
            </xsl:when>

            <xsl:when test="userlevel='3'">
                <div class="org bold">Organiser</div>
            </xsl:when>

            <xsl:otherwise>
                <div class="name adm bold">Administrator</div>
            </xsl:otherwise>
        </xsl:choose>
        </div>
    </xsl:template>

</xsl:stylesheet>

运行更正的转换现在会产生预期的结果

<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-16">
<title>Registered Members</title>
<link rel="stylesheet" type="text/css" href="user.css">
</head>
<body>
<h1>Registered Members</h1>
<div class="userdiv">
<div class="heading bold"><h2>USER ID: 1</h2></div>
<div class="small bold">NAME:</div>
<div class="large">Abbie Hunt</div>
<div class="small bold">ADDRESS:</div>
<div class="large">108 Access Road</div>
<div class="small bold">CITY:</div>
<div class="large">Wells</div>
<div class="small bold">COUNTY:</div>
<div class="large">Somerset</div>
<div class="small bold">POSTCODE:</div>
<div class="large">BA5 8GH</div>
<div class="small bold">TELEPHONE:</div>
<div class="large">01528927616</div>
<div class="small bold">MOBILE:</div>
<div class="large">07085252492</div>
<div class="small bold">EMAIL:</div>
<div class="large"><a href="mailto:adrock@gmail.com">adrock@gmail.com</a></div>
<div class="small bold">SEX:</div>
<div class="colored bold">
<div class="sex female">Female</div>
</div>
<div class="small bold">USERNAME:</div>
<div class="large">AdRock</div>
<div class="small bold">ACCOUNT TYPE:</div>
<div class="colored ">
<div class="name adm bold">Administrator</div>
</div>
</div>
<div class="userdiv">
<div class="heading bold"><h2>USER ID: 2</h2></div>
<div class="small bold">NAME:</div>
<div class="large">Aidan Harris</div>
<div class="small bold">ADDRESS:</div>
<div class="large">103 Aiken Street</div>
<div class="small bold">CITY:</div>
<div class="large">Chichester</div>
<div class="small bold">COUNTY:</div>
<div class="large">Sussex</div>
<div class="small bold">POSTCODE:</div>
<div class="large">PO19 4DS</div>
<div class="small bold">TELEPHONE:</div>
<div class="large">01905149894</div>
<div class="small bold">MOBILE:</div>
<div class="large">07784467941</div>
<div class="small bold">EMAIL:</div>
<div class="large"><a href="mailto:ambientexpert@yahoo.co.uk">ambientexpert@yahoo.co.uk</a></div>
<div class="small bold">SEX:</div>
<div class="colored bold">
<div class="sex male">Male</div>
</div>
<div class="small bold">USERNAME:</div>
<div class="large">AmbientExpert</div>
<div class="small bold">ACCOUNT TYPE:</div>
<div class="colored ">
<div class="vol bold">Volunteer</div>
</div>
</div>
</body>
</html>

答案 1 :(得分:-2)

有很多错误。主要有以下几点:

  • 您无法将模板应用于属性
  • 如果你写<xsl:apply-templates select="personal/name"/>,你可以写<xsl:template match="name">来匹配它。 (还有其他节点)