假设我有这个:
<nodes>
<node>
<number>1</number>
<name>"ABC"</name>
<comment>"blah"</comment>
</node>
<node>
<number>2</number>
<name>"DEF"</name>
<comment>"blah blah"</comment>
</node>
<node>
<number>3</number>
<name>"XYZ"</name>
<comment>"blah blah blah"</comment>
</node>
</nodes>
我想最终得到这个:
<nodes>
<node>
<number>3</number>
<name>"XYZ"</name>
<comment>"blah blah blah"</comment>
</node>
<node>
<number>2</number>
<name>"DEF"</name>
<comment>"blah blah"</comment>
</node>
<node>
<number>1</number>
<name>"ABC"</name>
<comment>"blah"</comment>
</node>
</nodes>
答案 0 :(得分:2)
<强>予。在您的情况下,解决方案就像这个:
一样简单<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<nodes>
<xsl:apply-templates select="node">
<xsl:sort select="position()" data-type="number" order="descending"/>
</xsl:apply-templates>
</nodes>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<nodes>
<node>
<number>1</number>
<name>"ABC"</name>
<comment>"blah"</comment>
</node>
<node>
<number>2</number>
<name>"DEF"</name>
<comment>"blah blah"</comment>
</node>
<node>
<number>3</number>
<name>"XYZ"</name>
<comment>"blah blah blah"</comment>
</node>
</nodes>
产生了想要的正确结果:
<nodes>
<node>
<number>3</number>
<name>"XYZ"</name>
<comment>"blah blah blah"</comment>
</node>
<node>
<number>2</number>
<name>"DEF"</name>
<comment>"blah blah"</comment>
</node>
<node>
<number>1</number>
<name>"ABC"</name>
<comment>"blah"</comment>
</node>
</nodes>
<强> II。反转一个节点集,其节点都属于同一个文档:
如果我们想要反转节点集的节点并使文档中的所有其他节点“按原样”保留,事情变得更加棘手。
让这个XML文档:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
我们希望从中生成一个文档,其中具有奇数值的num
元素的顺序相同,但具有偶数值的num
元素的顺序相反。结果必须是:
<nums>
<num>01</num>
<num>10</num>
<num>03</num>
<num>08</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>04</num>
<num>09</num>
<num>02</num>
</nums>
以下是产生所需结果的转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vNodes" select="/*/*[. mod 2 = 0]"/>
<xsl:variable name="vrtfReverse">
<xsl:for-each select="$vNodes">
<xsl:sort select="position()" data-type="number" order="descending"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="vReverse" select="ext:node-set($vrtfReverse)/*"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*/*">
<xsl:choose>
<xsl:when test="count(. | $vNodes) > count($vNodes)">
<xsl:call-template name="identity"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="vPositionInNodeSet" select=
"count($vNodes
[count(.
| current()/preceding::node()
| current()/ancestor::node()
)
=
count( current()/preceding::node()
| current()/ancestor::node()
)
]
) +1"/>
<xsl:for-each select="$vReverse[position() = $vPositionInNodeSet]">
<xsl:call-template name="identity"/>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
这是一个简单的XSLT 1.0样式表,用于反转'节点'下的节点...
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="nodes">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates select="node()">
<xsl:sort select="position()" data-type="number" order="descending" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>