微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有一种优雅的方法来使用XSLT添加多个HTML类?

假设我正在将多项选择测验从任意 XML格式转换为HTML.每个选项将表示为HTML< li>结果文档中的标记.对于每个选项,我想在< li>中添加正确的HTML类.如果那个选择是正确的答案.此外,如果该选项是用户选择的选项,我想添加一个提交给< li>的类.因此,如果选择是正确的以及提交的那个,则< li>应该有一类正确的提交.

据我所知,空格分隔的属性值不是XML数据模型的一部分,因此无法通过XSLT直接创建.但是,我觉得有一种更好的方法可以做到这一点,而不是为每个可能的类组合用一个条件乱码(在这个例子中这是可以接受的,但在更复杂的场景中是不实用的).

我怎样才能以优雅的方式解决这个问题?

期望结果的示例:

<p>Who trained Obi-Wan Kenobi?</p>
<ul>
    <li>Mace Windu</li>
    <li class="correct submitted">Qui-Gon Jinn</li>
    <li>Ki-Adi-Mundi</li>
    <li>Yaddle</li>
</ul>

解决方法

首先,XML中的属性值中的空格没有任何问题:粗略地说,attribute value normalization将空白字符转换为空格,并在解析文档时将相邻空格折叠到单个空格,但绝对允许空格.编辑:有关此内容的更多信息,请参见下文.

正如你在评论中提到的那样,马修威尔逊的方法未能在可能的值之间包含空格.然而,他的方法基本上是合理的.拼图的最后一块是你不喜欢冗余空间:这些可以通过使用normalize-space XPath函数来消除.

下面的样式表将所有位放在一起 – 请注意,它对输入文档没有任何作用,因此出于测试目的,您可以针对任何XML文档运行它,甚至可以针对自身运行它,以验证输出是否满足您的要求.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:variable name="foo0" select="false()"/>
  <xsl:variable name="bar0" select="true()"/>

  <xsl:variable name="foo1" select="true()"/>
  <xsl:variable name="bar1" select="false()"/>

  <xsl:variable name="foo2" select="true()"/>
  <xsl:variable name="bar2" select="true()"/>

  <xsl:template match="/">

    <xsl:variable name="foobar0">
      <xsl:if test="$foo0"> foo</xsl:if>
      <xsl:if test="$bar0"> bar</xsl:if>
    </xsl:variable>

    <xsl:variable name="foobar1">
      <xsl:if test="$foo1"> foo</xsl:if>
      <xsl:if test="$bar1"> bar</xsl:if>
    </xsl:variable>

    <xsl:variable name="foobar2">
      <xsl:if test="$foo2"> foo</xsl:if>
      <xsl:if test="$bar2"> bar</xsl:if>
    </xsl:variable>

    <li>
      <xsl:attribute name="class">
        <xsl:value-of select="normalize-space($foobar0)"/>
      </xsl:attribute>
    </li>
    <li>
      <xsl:attribute name="class">
        <xsl:value-of select="normalize-space($foobar1)"/>
      </xsl:attribute>
    </li>
    <li>
      <xsl:attribute name="class">
        <xsl:value-of select="normalize-space($foobar2)"/>
      </xsl:attribute>
    </li>

  </xsl:template>
</xsl:stylesheet>

编辑:进一步讨论在属性值中分隔离散组件的空格问题:XML Spec将许多可能的有效构造定义为attribute types,包括IDREFS和NMTOKENS.第一种情况与Names生产相匹配,第二种情况与NMTokens生产相匹配;这两个产品都被定义为包含多个适当类型的值,由空格分隔.因此,以空格分隔的值列表作为单个属性的值是XML信息集的固有组件.

原文地址:https://www.jb51.cc/html/225393.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐