【问题标题】:Styling of XML through XSLT通过 XSLT 设置 XML 样式
【发布时间】:2011-11-10 12:47:59
【问题描述】:

我有一个 XSLT 文档,它可以像这样输出 XML 文档的内容:

    <?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">         
    <xsl:template match="/">    
    <html>
    <head>
        <title>CL Results</title>
        <link href="xml.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
    <h1>34 Participants</h1>
        <table>      
        <xsl:for-each select="results/person">      
            <tr>
                <th colspan="16">
                    <a>
                        <xsl:attribute name="href">
                            mailto:<xsl:value-of select="@epost" />
                        </xsl:attribute>
                        <xsl:value-of select="@name"/>
                    </a>
                </th>        
            </tr>      
            <xsl:for-each select="stage">
                <tr>                            
                    <xsl:for-each select="team">
                        <td><xsl:value-of select="."/></td>                         
                    </xsl:for-each>         
                </tr>
            </xsl:for-each>
       </xsl:for-each>
      </table>
     </body>
     </html>
    </xsl:template>
</xsl:stylesheet>

我希望为包含某些团队的 td 元素赋予不同的样式。

所以我需要一个包含例如“Barcelona”、“Arsenal”和“Lyon”(以及更多)的数组,并且每当 XML 的团队元素包含其中任何一个时,我希望团队显示在例如红色。

我该怎么做?

【问题讨论】:

    标签: xml arrays xslt


    【解决方案1】:

    我假设您指的是 xsl 转换的这一部分:

    <xsl:for-each select="team">
        <td><xsl:value-of select="."/></td>                         
    </xsl:for-each>       
    

    你可以使用条件句:

    <xsl:for-each select="team">
        <xsl:variable name="color">
          <xsl:choose>
            <xsl:when test=". = 'Barcelona'">
              red
            </xsl:when>
            <xsl:when test=". = 'Arsenal'">
              blue
            </xsl:when>
            <xsl:otherwise>
              yellow
            </xsl:otherwise>
          </xsl:choose>
        </xsl:variable>
        <td style="color:{$color}">
          <xsl:value-of select="."/>
        </td>
      </xsl:for-each>
    

    【讨论】:

    • 这确实可以解决问题,谢谢,但这是一种通过在团队中使用数组来减少测试量的方法吗?
    • @maralbjo 不是数组。但是每个团队与其颜色之间的映射确实会有所帮助。然后你会使用团队的名称作为键,当然值是颜色。
    【解决方案2】:

    你最好匹配模板。

    <xsl:for-each select="team">
        <td><xsl:apply-templates /></td>                         
    </xsl:for-each>
    
    <xsl:template match="team">
       <div class="normal"><xsl:value-of select="@name" /></div>
    </xsl:template>
    
    <xsl:template match="team[@name='Barelona' | @name='Lyon' | @name='Arsenal']">
       <div class="red"><xsl:value-of select="@name" /></div>
    </xsl:template>
    

    或者另一种选择是保留一个相对于 XSL 的 XML 文件并使用 document() 函数引用它。因此,如果您有一个名为 redTeams.xml 的文件,看起来像这样:

    <redTeams>
        <team name="Barcelona" />
        <team name="Arsenal" />
        <team name="Lyon" />
    </redTeams>
    

    你可以这样引用它:

    <xsl:template match="team[@name = document('redTeams.xml')/redTeams/team/@name]">
       <div class="red"><xsl:value-of select="@name" /></div>
    </xsl:template>
    

    或者,如果您需要以编程方式执行此操作,您也可以使用 xsl:param 将变量传递到 XSL 并与之匹配。

    【讨论】:

      【解决方案3】:

      试试

      <td class="{team}">
      

      然后使用 CSS 样式表为每个团队定义适当的颜色。最好使用 XSLT 来获得 HTML 的结构安排,并使用 CSS 来获得每个 HTML 元素的详细样式。

      (如果需要,您也可以使用 XSLT 生成 CSS 样式表,尽管我在实践中很少看到这样做。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-15
        • 2012-12-10
        • 1970-01-01
        • 2010-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多