想要从元素的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将没有值。因此,对于具有值的属性,属性列表中的值必须具有值。
如何修改解决方案中与上面链接的线程的代码,使其以属性为中心而不是以元素为中心?
提前感谢您提供的任何帮助。
答案 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
如果您想省略多个属性 .. attr1
和attr2
..
<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