基于属性的结局XML转换(XML transformation based on attribute

2019-10-29 12:17发布

我有这个XML代码:

<items>
    <item name="xyz_low" />
    <item name="xyz_hight" />
    <item name="xyz_medium" />
    <item name="abc_medium" />
    <item name="abc_low" />
    <item name="abc_hight" />
</items>

我想获得这样的:

<items>
    <item name="xyz_hight" />
    <item name="xyz_medium" />
    <item name="xyz_low" />
    <item name="abc_hight" />
    <item name="abc_medium" />
    <item name="abc_low" />
</items>

排序只发生与属性名称(下划线之前的部分)相同的第一部分标记之间。 顺序是身高,中,低。

我已经看ends-with ,但它是不够的,因为我不知道,如果第一部分可以XYZ,农行或其他什么东西做的。

我并不需要在第一部分进行排序:我只是想集团以同样的方式开始项目标签内的后缀进行排序。

它是可能的,或者我应该选择不同的方法?

Answer 1:

若要按一定固定的顺序的项目,如这个,你可以使用一个技巧是这样的:定义一个变量的排序顺序

<xsl:variable name="sortOrder" select="'|hight|medium|low|'" />

现在你可以使用排序

<xsl:sort select="string-length(substring-before($sortOrder, concat('|', value, '|')))"
          data-type="number" />

不管什么value ,你需要。 如果value是“HIGHT”,则substring-before将一个长度为0,对于“中”这将是长度为6等的

下面是一个XSLT 2.0模板会做你以后,假设变量定义

<xsl:template match="items">
  <items>
    <xsl:for-each-group select="item" group-adjacent="substring-before(@name, '_')">
      <xsl:perform-sort select="current-group()">
        <xsl:sort select="string-length(substring-before($sortOrder,
                                concat('|', substring-after(@name, '_'), '|')))"
          data-type="number" />
      </xsl:perform-sort>
    </xsl:for-each-group>
  </items>
</xsl:template>

做同样在XSLT 1.0你需要做一个Muenchian分组的伎俩

<xsl:key name="itemByPrefix" match="item" use="substring-before(@name, '_')" />

然后在模板

<xsl:template match="items">
  <items>
    <xsl:for-each select="item[generate-id() = generate-id(
                key('itemByPrefix', substring-before(@name, '_'))[1])]">
      <xsl:for-each select="key('itemByPrefix', substring-before(@name, '_'))">
        <xsl:sort select="string-length(substring-before($sortOrder,
                                concat('|', substring-after(@name, '_'), '|')))"
          data-type="number" />
        <xsl:copy-of select="." />
      </xsl:for-each>
    </xsl:for-each>
  </items>
</xsl:template>

(如果有几个不同组的XSLT 2.0版本仍然有效items源文件中的XSLT 1.0版本将得到在这种情况下很多混乱)。



文章来源: XML transformation based on attributes endings
标签: xml xslt