我需要在XSLT中从属性列表(而不是元素)构建一个字符串

时间:2010-02-09 17:26:19

标签: xslt

想要从元素的3个可能属性的列表中创建逗号分隔的字符串。

我在这里找到了一个帖子: XSLT concat string, remove last comma

描述了如何从元素构建逗号分隔的字符串。我想用属性列表做同样的事情。

来自以下元素:

<myElement attr1="Don't report this one" attr2="value1" attr3="value2" attr4="value3" />

我想生成一个字符串,其内容为:“value1,value2,value3”

另一个警告:attr2到attr4可能有也可能没有值,但如果它们有值,它们将按顺序排列。因此,如果attr3没有,attr4将没有值。如果attr2没有,attr3将没有值。因此,对于具有值的属性,属性列表中的值必须具有值。

如何修改解决方案中与上面链接的线程的代码,使其以属性为中心而不是以元素为中心?

提前感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:3)

这在principe中很容易,但前提是要清除哪个属性。由于属性不按XML定义(与元素相反),因此您需要说明如何识别要跳过的属性。

修改:关于属性订单,XML section 3.1说:

  

请注意,start-tag或empty-element标记中的属性规范顺序并不重要。

那就是说,这样的事情可以解决问题(根据你的需要调整[]条件):

<xsl:template match="myElement">
  <xsl:for-each select="@*[position()!=1]">
    <xsl:value-of select="." />
    <xsl:if test="position()!=last()">,</xsl:if>
  </xsl:for-each>
</xsl:template>

答案 1 :(得分:3)

在XSLT 2.0中,它就像

一样简单
<xsl:template match="myElement">
  <xsl:value-of select="@* except @att1" separator=","/>
</xsl:template>

答案 2 :(得分:1)

我很感激Lucero的回答。他肯定已经把它钉了..
好了,这是另外一个截断属性attr1的代码,它出现在属性列表中除1之外的任何位置。
这样的场景::

<myElement attr2="value1" attr3="value2" attr4="value3" attr1="Don't report this one" />

这是XSLT代码.. ::

  <xsl:template match="myElement">
    <xsl:for-each select="@*[name()!='attr1']">
      <xsl:value-of select="." />
      <xsl:if test="position()!=last()">,</xsl:if>
    </xsl:for-each>
  </xsl:template>

输出结果为:

value1,value2,value3

如果您想省略多个属性 .. attr1attr2 ..

  <xsl:template match="myElement">
    <xsl:for-each select="@*[name()!='attr1' and name()!='attr2']">
      <xsl:value-of select="." />
      <xsl:if test="position()!=last()">,</xsl:if>
    </xsl:for-each>
  </xsl:template>

相应的输出将是:

value2,value3