我需要一些基于另一个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应该是什么?
提前致谢。
答案 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" />
...或将其作为样式表参数传递。