2012-03-12 83 views
2

用XSLT创建列表,我有以下XML文件:从两个XML文档

<root> 
    <sub type="print">print</sub> 
    <sub type="email">email</sub> 
</root> 

我想匹配每个对下面的列表中键入了:

<types> 
    <type>email</type> 
    <type>broadcast</type> 
    <type>mobile</type> 
    <type>print</type> 
    <type>web</type> 
</types> 

使用此XSLT与“ doc“是xml和”types“上面列表中传入的参数:

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

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

    <xsl:param name="doc"/> 
    <xsl:param name="types"/> 

    <xsl:template match="/"> 
    <xsl:for-each select="$doc//sub"> 
     <xsl:variable name="count"> 
     <xsl:number value="position()" format="1"/> 
     </xsl:variable> 

     <ul> 
     <xsl:for-each select="$types//type"> 
      <xsl:choose> 
      <xsl:when test="$doc//sub[$count]/@type = text()"> 
       <li> 
       <b> 
        <xsl:value-of select="$doc//sub[$count]/@type"/> - <xsl:value-of select="text()"/> 
       </b> 
       </li> 
      </xsl:when> 
      <xsl:otherwise> 
       <li> 
       <xsl:value-of select="$doc//sub[$count]/@type"/> - <xsl:value-of select="text()"/> 
       </li> 
      </xsl:otherwise> 
      </xsl:choose> 
     </xsl:for-each> 
     </ul> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

这应该给我一个无序列表f或者我的xml中的每个sub都从sub打印,然后打印每个类型的类型。当子和类型匹配时,它应该是粗体。我想这一点:

<ul> 
    <li>print - email</li> 
    <li>print - broadcast</li> 
    <li>print - mobile</li> 
    <li><b>print - print</b></li> 
    <li>print - web</li> 
</ul> 
<ul> 
    <li><b>email - email</b></li> 
    <li>email - broadcast</li> 
    <li>email - mobile</li> 
    <li>email - print</li> 
    <li>email - web</li> 
</ul> 

但我得到这个:

<ul> 
    <li><b>print email - email</b></li> 
    <li>print email - broadcast</li> 
    <li>print email - mobile</li> 
    <li><b>print email - print</b></li> 
    <li>print email - web</li> 
</ul> 
<ul> 
    <li><b>print email - email</b></li> 
    <li>print email - broadcast</li> 
    <li>print email - mobile</li> 
    <li><b>print email - print</b></li> 
    <li>print email - web</li> 
</ul> 

感谢任何及所有的帮助。

回答

1

我认为这可能与//的多种用途有关。

尝试用这种替代你的根模板(match="/"):

<xsl:template match="/"> 
    <html> 
     <xsl:for-each select="$doc/root/sub"> 
     <xsl:variable name="vType" select="@type"/> 
     <ul> 
      <xsl:for-each select="$types/types/type"> 
      <li> 
       <xsl:choose> 
       <xsl:when test=".=$vType"> 
        <b> 
        <xsl:value-of select="concat($vType,' - ',.)"/> 
        </b> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:value-of select="concat($vType,' - ',.)"/> 
       </xsl:otherwise> 
       </xsl:choose>    
      </li> 
      </xsl:for-each> 
     </ul> 
     </xsl:for-each>  
    </html> 
    </xsl:template> 

注:我添加了<html>标签,以保持我的输出测试时良好的。

+0

谢谢!将类型从“sub”设置为变量,然后使用“。”将类型与“类型”区分开来。是一个胜利者。像魅力一样工作! – SpockJenkins 2012-03-12 17:50:22

+0

@ user972029 - 非常欢迎您! +1是一个很好的问题。 – 2012-03-12 18:10:20

0

鉴于你的子文件作为主要输入和类型subtypes.xml

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


<xsl:template match="sub"> 
<ul> 
    <xsl:apply-templates select="doc('subtypes.xml')"> 
    <xsl:with-param name="this" select="." tunnel="yes"/> 
    </xsl:apply-templates> 
</ul> 
</xsl:template> 

<xsl:template match="type"> 
<xsl:param name="this" tunnel="yes"/> 
<li> 
    <xsl:choose> 
    <xsl:when test="$this/@type=."> 
    <b><xsl:value-of select="$this/@type,' - ',."/></b> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:value-of select="$this/@type,' - ',."/> 
    </xsl:otherwise> 
    </xsl:choose> 
</li> 
</xsl:template> 

</xsl:stylesheet> 

生产:

<?xml version="1.0" encoding="UTF-8"?> 
    <ul> 
    <li>print - email</li> 
    <li>print - broadcast</li> 
    <li>print - mobile</li> 
    <li><b>print - print</b></li> 
    <li>print - web</li> 
</ul> 
    <ul> 
    <li><b>email - email</b></li> 
    <li>email - broadcast</li> 
    <li>email - mobile</li> 
    <li>email - print</li> 
    <li>email - web</li> 
</ul>