使用xslt变量输出html标记中的属性名称和属性值

时间:2011-11-24 10:50:52

标签: xslt xpath

我必须将microodata(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}">

所以问题是 - 我可以将带有属性名称和属性值的字符串放在带有xslt的html标记中吗?类似的东西:

<div class="list_item" $variable_with_attribute_name_and_attribute_value>

提前致谢

2 个答案:

答案 0 :(得分:3)

我不相信你可以按照你描述的方式使用参数。但如果目标是删除重复编码,则可以通过命名模板而不是变量来实现。

例如,这是一个命名模板

   <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 :(得分:1)

这可以通过一种非常简单的方式完成 - 不使用<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()函数。