вывести имя атрибута и значение атрибута в HTML-тег с помощью переменной xslt - PullRequest
1 голос
/ 24 ноября 2011

Я должен поместить микроданные (schema.org) в тег html следующим образом:

<div class="list_item" itemtype="http://schema.org/Hotel" itemscope="itemscope">

Я хочу поместить все данные микроданных в одну переменную, например:

<xsl:param name="schema_main">
      <xsl:choose>

           <xsl:when test="$list_type = 'hotels'">
                <xsl:text>itemtype="http://schema.org/Hotel" itemscope="itemscope"</xsl:text>
           </xsl:when>

           <xsl:when test="$list_type = 'sight'">
                <xsl:text>itemtype="http://schema.org/CivicStructure" itemscope="itemscope"</xsl:text>
           </xsl:when>

       </xsl:choose>
   </xsl:param>

Но я не могу этого сделать, потому что мне нужно указать имя атрибута в xslt, чтобы поместить любое содержимое:

 <div class="list_item" itmescope="{$some_variable}">

Так что вопрос - могу ли я поместить строку с именем атрибута и значением атрибута в HTMLпометить с помощью xslt?Что-то вроде:

<div class="list_item" $variable_with_attribute_name_and_attribute_value>

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 24 ноября 2011

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

Например, вот именованный шаблон

   <xsl:template name="schema_main">
      <xsl:attribute name="itemtype">
         <xsl:choose>
            <xsl:when test="$list_type = 'hotels'">
               <xsl:text>http://schema.org/Hotel</xsl:text>
            </xsl:when>
            <xsl:when test="$list_type = 'sight'">
               <xsl:text>http://schema.org/CivicStructure</xsl:text>
            </xsl:when>
         </xsl:choose>
      </xsl:attribute>
      <xsl:attribute name="itemscope">itemscope</xsl:attribute>
   </xsl:template>

Ичтобы вызвать его, чтобы добавить атрибуты к текущему элементу, вы просто должны сделать это

  <div>
     <xsl:call-template name="schema_main"/>
  </div>

И тогда результат будет следующим:

<div itemtype="http://schema.org/Hotel" itemscope="itemscope" />

Это предполагает, что вы установили list_type для отелей.Обратите внимание, что можно передавать параметры в именованный шаблон, если list_type не является глобальным по объему.

1 голос
/ 24 ноября 2011

Это можно сделать очень простым способом - без <xsl:choose> / <xsl:when> и <xsl:call-template> не используется :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my" exclude-result-prefixes="my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:param name="list_type" select="'BB'"/>

 <my:Schemas>
  <schema type="Hotel" aka="hotels"/>
  <schema type="CivicStructure" aka="sight"/>
  <schema type="BreadAndBreakfast" aka="BB"/>
 </my:Schemas>

 <xsl:variable name="vSchemas" select=
              "document('')/*/my:Schemas/*"/>

 <xsl:template match="/">
    <div class="list_item"
         itemtype="http://schema.org/{$vSchemas[@aka=$list_type]/@type}"
         itemscope="itemscope"/>
 </xsl:template>
</xsl:stylesheet>

, когда этопреобразование применяется к любому XML-документу (в этом примере не используется), желаемый, правильный результат будет получен :

<div class="list_item" itemtype="http://schema.org/BreadAndBreakfast"
                       itemscope="itemscope"/>

Примечание : элемент <my:Schemas> обычно будетпередаваться как внешний параметр преобразования, и в этом случае на него будет ссылаться напрямую, без функции document().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...