获取模板以根据传入参数的条件结果将 class 应用于跨度

Getting a template to apply a class to a span based on conditional results of passed in parameters

这只是一个测试脚本,如果需要,我可以提供两个测试 XML 数据块。

剧本:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msa="http://www.publictalksoftware.co.uk/msa">
  <xsl:output method="html" indent="yes" version="4.01"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
    doctype-public="//W3C//DTD XHTML 1.0 Transitional//EN"/>

  <xsl:variable name="PubDB" select="document('MSA_PublisherDatabase.XML')"/>
  <xsl:template match="/">
    <html>
      <head>
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <title>Test</title>
      </head>
      <body>
        <xsl:for-each select="MeetingWorkBook/Meeting">
          <xsl:call-template name="IsAvailableMidweek">
            <xsl:with-param name="strName" select="Chairman"/>
          </xsl:call-template>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>

  <xsl:template name="IsAvailableMidweek">
    <xsl:param name="strName"/>
    <xsl:variable name="thePublisher" select="$PubDB/msa:PublisherDatabase/msa:Publishers/msa:Publisher[msa:Name=$strName]"/>
    <xsl:if test="$thePublisher">
      <xsl:choose>
        <xsl:when test="$thePublisher/msa:Availability/@Midweek='false'">
          <p>Not available @Midweek</p>
        </xsl:when>
        <xsl:otherwise>
          <xsl:variable name ="datMonth" select="format-number(MeetingDate/@Month,'00')"/>
          <xsl:variable name ="datDay" select="format-number(MeetingDate/@Day,'00')"/>
          <xsl:variable name="datMeeting" select="concat(MeetingDate/@Year, '-', $datMonth, '-', $datDay)"/>
          <xsl:choose>
            <xsl:when test="$thePublisher/msa:Availability/msa:DatesNotAvailable[msa:Date=$datMeeting]">
              <p>
                <xsl:text>Not available for date </xsl:text>
                <xsl:value-of select="$datMeeting"/>
              </p>
            </xsl:when>
            <xsl:otherwise>
              <p>Available</p>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

我一直在研究 IsAvailableMidweek 模板,原则上它可以工作。它显示的内容是为了调试目的。

我面临的挑战是我想在 span 中显示(这个特定案例)主席作为文本。如果他被确定为“不可用”,那么我想将 NotAvailable 的 class 应用到 span 对象。

我知道如何在 span 中显示值。这很简单。但是如何调整我写的模板IsAvailableMidweek,如果它确定此人不可用,它可以应用这个class?

我希望这是有道理的。我不认为我可以在 XSLT-1 中使用函数。

我不知道这是否是最好的方法,但它似乎符合我的要求:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msa="http://www.publictalksoftware.co.uk/msa">
  <xsl:output method="html" indent="yes" version="4.01"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
    doctype-public="//W3C//DTD XHTML 1.0 Transitional//EN"/>

  <xsl:variable name="PubDB" select="document('MSA_PublisherDatabase.XML')"/>
  <xsl:template match="/">
    <html>
      <head>
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <title>Test</title>
      </head>
      <body>
        <xsl:for-each select="MeetingWorkBook/Meeting">
          <p>
            <xsl:call-template name="SetClassName">
              <xsl:with-param name="strName" select="Chairman"/>
            </xsl:call-template>
            <xsl:value-of select="Chairman"/>
          </p>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>

  <xsl:template name="SetClassName">
    <xsl:param name="strName"/>
    <xsl:variable name="thePublisher" select="$PubDB/msa:PublisherDatabase/msa:Publishers/msa:Publisher[msa:Name=$strName]"/>
    <xsl:if test="$thePublisher">
      <xsl:choose>
        <xsl:when test="$thePublisher/msa:Availability/@Midweek='false'">
          <xsl:attribute name="class">NotAvailable</xsl:attribute>
        </xsl:when>
        <xsl:otherwise>
          <xsl:variable name ="datMonth" select="format-number(MeetingDate/@Month,'00')"/>
          <xsl:variable name ="datDay" select="format-number(MeetingDate/@Day,'00')"/>
          <xsl:variable name="datMeeting" select="concat(MeetingDate/@Year, '-', $datMonth, '-', $datDay)"/>
          <xsl:choose>
            <xsl:when test="$thePublisher/msa:Availability/msa:DatesNotAvailable[msa:Date=$datMeeting]">
              <xsl:attribute name="class">NotAvailable</xsl:attribute>
            </xsl:when>
            <xsl:otherwise>
              <!-- Available — Do Further Tests -->
            </xsl:otherwise>
          </xsl:choose>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>