2

我想知道 XSLT 中是否有办法修改/添加到属性值。

现在我只是替换属性值:

<a class="project" href="#">
  <xsl:if test="new = 'Yes'">
    <xsl:attribute name="class">project new</xsl:attribute>
  </xsl:if>
</a>

但我不喜欢第project2 行中的重复。有没有更好的方法来做到这一点,例如简单地添加 new到属性的末尾?

谢谢你的帮助!

4

2 回答 2

3

您可以将if内部放入attribute而不是相反:

<a href="#">
  <xsl:attribute name="class">
    <xsl:text>project</xsl:text>
    <xsl:if test="new = 'Yes'">
      <xsl:text> new</xsl:text>
    </xsl:if>
  </xsl:attribute>
</a>

An<xsl:attribute>可以包含任何有效的 XSLT 模板(包括for-each循环、应用其他模板等),唯一的限制是实例化此模板只能生成文本节点,而不是元素、属性等。属性值将是所有这些的串联文本节点。

于 2012-12-30T19:39:53.213 回答
0

在 XSLT 1.0 中,可以使用这种单线

<a class="project{substring(' new', 5 - 4*(new = 'Yes'))}"/>

这是一个完整的转换

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
  <a class="project{substring(' new', 5 - 4*(new = 'Yes'))}"/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档时:

<t>
 <new>Yes</new>
</t>

产生了想要的正确结果:

<a class="project new"/>

说明

  1. AVT(属性值模板)的使用

  2. 要根据条件选择字符串,在 XPath 1.0 中,可以使用 substring 函数并指定一个表达式作为起始索引参数,当条件为时该表达式的值为 1true()并且某个数字大于字符串的长度 - - 否则。

  3. 我们使用的事实是,在 XPath 1.0 中*(乘法)运算符的任何参数都转换为数字,number(true()) = 1并且number(false()) = 0


二、XSLT 2.0 解决方案

使用这个单线

  <a class="project{(' new', '')[current()/new = 'Yes']}"/>

这是一个完整的转换

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
  <a class="project{(' new', '')[current()/new = 'Yes']}"/>
 </xsl:template>
</xsl:stylesheet>

当应用于同一个 XML 文档(上图)时,同样会产生相同的正确结果:

<a class="project new"/>

说明

  1. 正确使用AVT

  2. 正确使用序列

  3. 正确使用 XSLT 的current()功能。

于 2012-12-30T20:11:29.250 回答