使用Xsl变量

时间:2017-02-11 13:26:57

标签: xml xslt

我在XSLT中访问变量时遇到问题 我只是将var定义为:

<xsl:variable name="myName" select="@owner"/>

当我使用此代码时,它不起作用:

<title>{$myName}</title>

但是这段代码有效:

<title><xsl:value-of select="$myName"/></title>

我想将上面的变量与XML中的每个来自实体进行比较 当来自实体的值等于 myName 时,我会显示一些代码,否则会显示另一个代码

<xsl:for-each select="message">
   <xsl:choose>
        <xsl:when test="from = $myName">
           ...
      </xsl:when>
        <xsl:otherwise>
            ...
        </xsl:otherwise>
    </xsl:choose>
</xsl:for-each>

XML文件包含以下信息:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="history.xsl"?>
<history xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="history.xsd" owner="Mike">

 <message>
    <from>Mike</from>
    <to>Gem</to>
    <date>2002-09-24</date>
    <color>red</color>
    <size>20</size>
    <family>cursive</family>
    <style>overline</style>
    <body>welcome</body>
 </message>
</history>

1 个答案:

答案 0 :(得分:0)

这是一个XSLT:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
    <xsl:variable name="myName" select="/history/@owner"/>

    <xsl:template match="/">

        <xsl:apply-templates/>

    </xsl:template>

    <xsl:template match="message">
        <xsl:choose>
        <xsl:when test="from = $myName">
           Mike message
      </xsl:when>
        <xsl:otherwise>
            Other message
        </xsl:otherwise>
    </xsl:choose>        
    </xsl:template>
</xsl:transform>

它将在执行开始时拉取值并将其放入&#34; myName&#34;变量

然后,我匹配标签名称(消息)并像你一样使用XSL选择。

你也可以避免使用xsl:选择这样做:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
    <xsl:variable name="myName" select="/history/@owner"/>

    <xsl:template match="/">

        <xsl:apply-templates/>

    </xsl:template>

    <xsl:template match="message[from=$myName]">        
           Mike message                  
    </xsl:template>

    <xsl:template match="message">        
           Other message                  
    </xsl:template>
</xsl:transform>

这显示了一些重要的事情:XSL选择第一个匹配的模板!

第二种选择更适合模块化。第一个意味着筑巢。这第二个没有!

在线测试: