xsl变量没有传入值

时间:2014-10-21 11:04:17

标签: xml xslt xml-parsing

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" encoding="UTF-8"/>
<xsl:param name="contextPath">CONTEXT_PATH/</xsl:param>
<xsl:include href="xhtml.xsl"/>
<xsl:variable name="site"><xsl:value-of select="/leftnavigation/tree/path/node[2]/@name"/></xsl:variable>

        <xsl:template match="leftnavigation">
           <xsl:element name="h1">
                <xsl:attribute name="id">banner</xsl:attribute>

                        <xsl:apply-templates select="bannerleftimage" />
                        <xsl:apply-templates select="bannermiddleimage" />
                        <xsl:if test="$site='Families'">
                            <xsl:apply-templates select="bannerrightimage" />

                            <!-- Just to output the value for dev purposes -->
                            <xsl:text><xsl:value-of select="$site"/></xsl:text>
                        </xsl:if>

            </xsl:element>
            <xsl:element name="div">
                <xsl:attribute name="id">left_col</xsl:attribute>
                <xsl:apply-templates select="sectionlist" />
            </xsl:element>
            </xsl:template>

           <xsl:template match="bannerleftimage">           
            <xsl:variable name="currentsrc" select="@filename"/>
            <xsl:variable name="origwidth">
                <xsl:value-of select="//gallery/image[@filename=$currentsrc]/@width"/>  
            </xsl:variable> 
            <xsl:variable name="origheight">
                <xsl:value-of select="//gallery/image[@filename=$currentsrc]/@height"/>  
            </xsl:variable> 
            <xsl:variable name="ratio">
                <xsl:value-of select="$origwidth div $origheight"/>  
            </xsl:variable> 
             <xsl:variable name="origalt">
                <xsl:value-of select="//gallery/image[@filename=$currentsrc]/@alt"/>  
            </xsl:variable> 
             <xsl:variable name="origtitle">
                <xsl:value-of select="//gallery/image[@filename=$currentsrc]/@title"/>  
            </xsl:variable> 
            <xsl:element name="a">
                    <xsl:attribute name="href"><xsl:value-of select="$contextPath"/>/home.html</xsl:attribute>
                <xsl:element name="img">
                    <xsl:attribute name="src"><xsl:value-of select="$contextPath"/>/images/banners/<xsl:value-of select="@filename"/></xsl:attribute>
                    <xsl:attribute name="width">365</xsl:attribute>
                    <xsl:attribute name="height">100</xsl:attribute>
                    <xsl:attribute name="title"><xsl:value-of select="$origtitle"/></xsl:attribute>
                    <xsl:attribute name="alt"><xsl:value-of select="$origalt"/></xsl:attribute>
                </xsl:element>
            </xsl:element>
        </xsl:template>

        <xsl:template match="bannermiddleimage">            
            <xsl:variable name="currentsrc" select="@filename"/>
            <xsl:variable name="origwidth">
                <xsl:value-of select="//gallery/image[@filename=$currentsrc]/@width"/>  
            </xsl:variable> 
            <xsl:variable name="origheight">
                <xsl:value-of select="//gallery/image[@filename=$currentsrc]/@height"/>  
            </xsl:variable> 
            <xsl:variable name="ratio">
                <xsl:value-of select="$origwidth div $origheight"/>  
            </xsl:variable> 
             <xsl:variable name="origalt">
                <xsl:value-of select="//gallery/image[@filename=$currentsrc]/@alt"/>  
            </xsl:variable> 
             <xsl:variable name="origtitle">
                <xsl:value-of select="//gallery/image[@filename=$currentsrc]/@title"/>  
            </xsl:variable> 
            <xsl:element name="a">
                    <xsl:attribute name="href"><xsl:value-of select="$contextPath"/>/home.html</xsl:attribute>
                <xsl:element name="img">
                    <xsl:attribute name="id">banmiddle</xsl:attribute>
                    <xsl:attribute name="src"><xsl:value-of select="$contextPath"/>/images/banners/<xsl:value-of select="@filename"/></xsl:attribute>
                    <xsl:attribute name="width">1</xsl:attribute>
                    <xsl:attribute name="height">100</xsl:attribute>
                    <xsl:attribute name="title"><xsl:value-of select="$origtitle"/></xsl:attribute>
                    <xsl:attribute name="alt"><xsl:value-of select="$origalt"/></xsl:attribute>
                </xsl:element>
            </xsl:element>
        </xsl:template>

        <xsl:template match="bannerrightimage">  
            <xsl:variable name="currentsrc" select="@filename"/>
            <xsl:variable name="origwidth">
                <xsl:value-of select="//gallery/image[@filename=$currentsrc]/@width"/>  
            </xsl:variable> 
            <xsl:variable name="origheight">
                <xsl:value-of select="//gallery/image[@filename=$currentsrc]/@height"/>  
            </xsl:variable> 
            <xsl:variable name="ratio">
                <xsl:value-of select="$origwidth div $origheight"/>  
            </xsl:variable> 
             <xsl:variable name="origalt">
                <xsl:value-of select="//gallery/image[@filename=$currentsrc]/@alt"/>  
            </xsl:variable> 
             <xsl:variable name="origtitle">
                <xsl:value-of select="//gallery/image[@filename=$currentsrc]/@title"/>  
            </xsl:variable>
            <xsl:element name="div">
                <xsl:attribute name="id">bannerright</xsl:attribute>            
                <xsl:element name="div">
                  <xsl:attribute name="id">talktoexpert</xsl:attribute>
                  <xsl:attribute name="title">Talk to a specialist consultant</xsl:attribute>
                  Talk to a specialist consultant
                </xsl:element> 
                <xsl:element name="div">
                  <xsl:attribute name="id">bannertel</xsl:attribute>
                  <xsl:attribute name="title"><xsl:value-of select="$origtitle"/></xsl:attribute>
                  <xsl:value-of select="../telephone"/>
                </xsl:element>    
                <xsl:element name="div">
                      <xsl:attribute name="id">bannertelint</xsl:attribute>
                      <xsl:attribute name="title"><xsl:value-of select="$origtitle"/></xsl:attribute>
                      <xsl:value-of select="../telephoneint"/>
                </xsl:element> 
            </xsl:element> 
        </xsl:template> 


        <xsl:template match="sectionlist">

        <xsl:element name="ul">
            <xsl:attribute name="id">side_menu</xsl:attribute>
            <xsl:for-each select="section">
                <xsl:element name="li">
                    <xsl:if test="@cssclass">
                        <xsl:attribute name="class"><xsl:value-of select="@cssclass"/></xsl:attribute>
                    </xsl:if>
                    <xsl:if test="@cssid">
                        <xsl:attribute name="id"><xsl:value-of select="@cssid"/></xsl:attribute>
                    </xsl:if>
                    <xsl:apply-templates select="xhtml"/>
                </xsl:element>
            </xsl:for-each>

        </xsl:element>

    </xsl:stylesheet>

我想要实现的目标:
我试图围绕模板(bannerrightimage)设置一个条件,使其不会出现在名为'Families'的特定品牌(在您的情况下为String)中。 @name通常会返回三个字符串,FamiliesChildrenAdults。它适用于我的其他xsl文件。

我遇到的问题是变量$site没有传递任何值。但如果我有类似的话:

<xsl:variable name="site"><xsl:text>ABC123</xsl:text>

$site输出ABC123。正如我之前提到的,如果我在home.xsl中,我会将我的变量改为:

home.xsl

<xsl:variable name="site"><xsl:value-of select="/home/tree/path/node[2]/@name"/>

如果它是 country.xsl ,我会将变量设置为:

<xsl:variable name="site"><xsl:value-of select="/country/tree/path/node[2]/@name"/>

home.xsl和country.xsl工作得非常好但是当我为 leftnavigation.xsl $site实现相同的样式时,没有返回任何值。甚至没有空地......

1 个答案:

答案 0 :(得分:1)

非常感谢@Tony Graham !!当你提到“XPath匹配结构”时,我意识到我没有检查我的leftnavigation.xml文件。我意识到在所有其他xml文件中,他们的xsd中有一个“COMMON”部分,其中包含我正在寻找的节点。但是,在我的leftnavigation.xsd文件中,它没有该部分因此当我在寻找我正在寻找的节点时..well [NULL]。

以下是我发现的内容,home-example.xml文件会查找noNamespacesSchemaLocation="home.xsd"

因此,在xml文件中,我正在寻找的部分是下面的节点部分。

主-的example.xml:

<path>
        <node name="root" url="" type="ROOT" mainimage=""/>
        <node name="Wildlife" type="SITE" mainimage=""/>
        <node name="2006" type="VERSION" mainimage=""/>
        <node name="homepages" type="SECTION" mainimage=""/>
        <node name="First Home Page" url="/home/home.html" mainimage=""/>
    </path>

因此在xsd中,有一个Commons部分,如下所示:
home.xsd:
================共同================================= =

</xs:documentation>
</xs:annotation>
<xs:element name="node">
    <xs:complexType>
        <xs:sequence minOccurs="0" maxOccurs="1">
            <xs:element ref="xhtml"/>
        </xs:sequence>
        <xs:attribute name="name" type="xs:string"/>
        <xs:attribute name="url" type="xs:string"/>
        <xs:attribute name="abstract" type="xs:string"/>
        <xs:attribute name="mainimage" type="xs:string"/>
        <xs:attribute name="type" type="xs:string"/>
        <xs:attribute name="metadata" type="xs:string"/>
    </xs:complexType>
</xs:element>
<xs:element name="sectionimg">
    <xs:complexType>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="alt" type="xs:string"/>
        <xs:attribute name="width" type="xs:string"/>
        <xs:attribute name="height" type="xs:string"/>
        <xs:attribute name="id" type="xs:string"/>
        <xs:attribute name="class" type="xs:string"/>           
    </xs:complexType>
</xs:element>
<xs:complexType name="treeType">
    <xs:sequence>
        <xs:element name="parent">
            <xs:complexType>
                <xs:sequence>
                    <xs:element ref="node" minOccurs="0"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:element name="children">
            <xs:complexType>
                <xs:sequence>
                    <xs:element ref="node" minOccurs="0" maxOccurs="100"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:element name="siblings">
            <xs:complexType>
                <xs:sequence>
                    <xs:element ref="node" minOccurs="0" maxOccurs="100"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:element name="path">
            <xs:complexType>
                <xs:sequence>
                    <xs:element ref="node" minOccurs="0" maxOccurs="100"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:sequence>
</xs:complexType>

但是,在我的leftnavigation-example.xml和我的leftnavigation.xsd中,当我尝试调用变量时,我没有xsd中的commons部分和xml中的nodes部分: / p>

<xsl:variable name="site"><xsl:value-of select="/leftnavigation/tree/path/node[2]/@name"/></xsl:variable>

我没有得到任何回复,因为所选路径的值不存在。

再次感谢@tony graham指出我正确的方向......