XSLT保留订单

时间:2014-01-14 16:16:26

标签: xml xslt

我正在尝试在XSLT转换中保留原始节点的顺序,例如:

我有以下文件

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
    <cd1></cd1>
    <cd2></cd2>
    <cd2></cd2>
    <cd1></cd1>
</catalog>

这是我的XSLT文件

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<root>
      <xsl:for-each select="catalog/cd1">
      <node>1</node>
      </xsl:for-each>
      <xsl:for-each select="catalog/cd2">
      <node>2</node>
      </xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>

期望的结果是:

<?xml version="1.0"?>
<root>
    <node>1</node>
    <node>2</node>
    <node>2</node>
    <node>1</node>
</root>

但实际上是:

<?xml version="1.0"?>
<root>
    <node>1</node>
    <node>1</node>
    <node>2</node>
    <node>2</node>
</root>

有没有办法保留节点的顺序?

2 个答案:

答案 0 :(得分:1)

我找到了一种解决方法,因为每个路径只接受一个路径,例如:

<xsl:for-each select="catalog/cd1 | catalog/cd2">

通过这种方法,我获得了所需的输出:)

答案 1 :(得分:0)

不要使用xsl:for-each(尽可能避免使用),而是编写与cd元素匹配的模板。

您的方法存在的问题

如果你这样写for-each

<xsl:for-each select="catalog/cd1">

您强制XSLT处理catalog的所有子节点,这些子节点首先称为“cd1” 。也就是说,只有在处理了所有for-each元素后,它才会开始处理第二个cd1

<强>样式表

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="/catalog">
  <root>
     <xsl:apply-templates/>
  </root>
</xsl:template>

<xsl:template match="cd1">
  <node>1</node>
</xsl:template>

<xsl:template match="cd2">
  <node>2</node>
</xsl:template>

</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <node>1</node>
  <node>2</node>
  <node>2</node>
  <node>1</node>
</root>