Как отредактировать xsl-файл, чтобы он загружал разные шаблоны, основываясь на проверке? - PullRequest
2 голосов
/ 13 мая 2011

У меня есть два xsl-файла для каждого типа машин

  1. для различных ароматизаторов unix
  2. для различных оконных машин

Я хочу загрузить другой xsl, основываясь на проверке имени oss из этих xsl

Например: if osname = "Windows", затем загрузить windows.xsl еще загрузить nix.xsl

Итак, для этого должен быть другой xsl, который выполняет проверку. Итак, как я могу загрузить эти windows и nix xsl на основе проверки osname?

для более подробной информации я даю xml для машин win и nix

  1. nix machine xml

    <machine> <system> <osname>Linux</osname> <username>Abhishek</username> </system> </machine>

  2. win machine xml

    <machine> <system> <osinfo> <osinfo field='OS Name' information='Microsoft(R) Windows(R) Server 2003 Enterprise x64 Edition ' /> <osinfo field='OS Version' information='5.2.3790 Service Pack 2 Build 3790 ' /> <osinfo field='OS Manufacturer' information='Microsoft Corporation ' /><br> </osinfo> <username>Matt</username> </system> </machine>

Я также предоставляю шаблоны,

unix xsl template

 <xsl:template name="unixsystem" match="machine">
    <span style="color:#328aa4"><a name="_systeminfo" href="#_top">System Info</a></span>

<table border="1" >
    <tbody>
    <tr>
    <th align="left">OS Name</th>
    <th align="left">User Name</th>
    </tr>
    <tr>
    <td><xsl:value-of select="system/osname"/></td>
    <td><xsl:value-of select="system/username"/></td>
    </tr>
    </tbody>
</table>

    </span>
</xsl:template>

Windows xsl template

<xsl:template name="winsystem" match="machine">
        <span style="color:#328aa4"><a name="_ospatches" href="#_top">OS Information: </a></span></h2>

        <table border="1">
            <tbody>
            <tr>
                <th>Field</th>
                <th>Information</th>
            </tr>

            <xsl:for-each select="osinfo/osinfo">
                <tr>
                    <td valign="top" ><xsl:value-of select="@field"/></td>
                    <td valign="top" style="width: 2;"><xsl:value-of select="@information"/></td>
                </tr>
            </xsl:for-each>
            </tbody>
        </table>
        </xsl:template>

Вместо использования contains это может работать?

<xsl:choose>
  <xsl:when test="osinfo/osinfo/@information='Windows'">
    <xsl:call-template name="winsystem"/>
  </xsl:when>
  <xsl:otherwise>
   <xsl:call-template name="unixsystem"/>
  </xsl:otherwise>
</xsl:choose>

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

Поскольку xsl:include или xsl:import должны быть дочерними по отношению к xsl:stylesheet, вы не сможете управлять ими условно.

Может быть, будет лучше, если вы включите обе таблицы в основной, а затем вызовете соответствующий шаблон на основе вашего выбора.

Пример:

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

  <xsl:include href="win.xsl"/>
  <xsl:include href="unix.xsl"/>

  <xsl:template match="/">
    <xsl:choose>
      <xsl:when test="contains(//osinfo/@information, 'Windows')">
       <xsl:call-template name="winsystem"/>
      </xsl:when>
      <xsl:otherwise>
       <xsl:call-template name="unixsystem"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

 </xsl:stylesheet>

Очевидно, что это всего лишь предложение, и оно основано на наличии двух шаблонов с именами win и unix на двух разных таблицах стилей с именами win.xsl и unix.xsl.

Надеюсь, это поможет


Расширенный ответ после просмотра шаблонов

Я бы назвал два шаблона по-разному и удалил match. Я имею в виду, я бы использовал:

unix xsl

<xsl:template name="unixsystem">
 <!-- your staff -->
</xsl:template>

windows xsl

<xsl:template name="winsystem">
 <!-- your staff -->
</xsl:template>

После этого вы можете вызывать шаблоны, как указано выше. Обратите внимание, что я удалил match. Таким образом, вы сможете вызывать шаблоны. Я не исследовал, правильно ли содержимое ваших файлов xsl. Я также исправил неправильный код (нераскрытый xsl:choose) в моем xsl.

1 голос
/ 13 мая 2011

Обычно, если вам нужны два варианта таблицы стилей, вы должны поместить часть WIN в WIN.xsl, часть LIN в LIN.xsl и общую часть в COMMON.xsl. Затем WIN.xsl должен импортировать COMMON.xsl; LIN.xsl должен импортировать COMMON.xsl; и если вы хотите вариант WIN, вы должны назначить WIN.xsl в качестве таблицы стилей верхнего уровня, а если вы хотите вариант LIN, вы должны назначить LIN.xsl.

Другими словами, код специального случая должен импортировать код общего назначения, а не наоборот.

...