通过xslt进行xml排序



我需要一些帮助来根据另一个xml对xml元素进行排序。我的主要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>

sorign不基于任何键或任何值。顺序是动态确定的(通过从DB中读取顺序),并且必须将主xml转换为该顺序。from db值类似

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

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

提前谢谢。

怎么样。。。

<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顺序变量,如下所示。。。

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

或者将其作为样式表参数传入。

最新更新