我正在尝试在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>
有没有办法保留节点的顺序?
答案 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>