通过xslt进行xml排序

时间:2015-10-28 17:21:06

标签: xml sorting xslt transpose

我需要一些基于另一个xml排序xmlelements的帮助。我的主要xml如下所示

<xml>
<A1>value</A1>
<A2>value</A2>
<B1>value</B1>
<B2>value</B2>
</xml>

我想要另一个看起来像这个

的xml
<xml>
<A1>value</A1>
<B1>value</B1>
<A2>value</A2>
<B2>value</B2>
</xml>

sortign不基于任何键或任何值。顺序是在运行中确定的(通过从DB读取顺序),主xml必须转换为该顺序。来自db值就像

tagname | order
------------
A1 | 1
B1 | 2
A2 | 3
A3 | 4

我该怎么做?我可以动态形成xslt。但xslt应该是什么?

提前致谢。

1 个答案:

答案 0 :(得分:1)

怎么样......

<xsl:transform
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
<xsl:output omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:variable name="elem-order" as="element(elem)*">
  <elem name="A1" />
  <elem name="B1" />
  <elem name="A2" />
  <elem name="B2" />
</xsl:variable>

<xsl:template match="/*">
  <xsl:copy>
    <xsl:apply-templates select="@*|comment()|processing-instruction()|text()" />
    <xsl:apply-templates select="*">
      <xsl:sort select="index-of( $elem-order, $elem-order[@name eq local-name( current())])" data-type="number" />
    </xsl:apply-templates>
  </xsl:copy>
</xsl:template>

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()" />
  </xsl:copy>
</xsl:template>

</xsl:transform>

如果元素顺序来自外部文件,请重新定义$ elem-order变量,如此...

<xsl:variable
    name="elem-order"
    select="doc('what-ever-uri')/elements/elem" />

...或将其作为样式表参数传递。