我正在研究从XML到XML的xml转换。我为新转换的XML定义了XSD。XSD对每个元素都有一些预定义的序列/顺序。如何在XML转换时从XSD出现相同的序列?
我试图按照与XSD中相同的顺序排列转换顺序,但了解到转换顺序与xslt执行顺序不同。
感谢您的回应
<ROOT>
<A1>A</A1>
<B1>B</B1>
<C1>C</C1>
<D1>D</D1>
</ROOT>
<ROOT>
<a1>A</a1>
<d1>D</d1>
<b1>B</b1>
<c1>C</c1>
</ROOT>
我根据您的建议尝试了以下
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ROOT">
<xsl:apply-templates select="A1,D1,C1,B1" />
</xsl:template>
<xsl:template match="A1">
<a1>
<xsl:apply-templates />
</a1>
</xsl:template>
<xsl:template match="B1">
<b1>
<xsl:apply-templates />
</b1>
</xsl:template>
<xsl:template match="C1">
<c1>
<xsl:apply-templates />
</c1>
</xsl:template>
<xsl:template match="D1">
<d1>
<xsl:apply-templates />
</d1>
</xsl:template>
</xsl:stylesheet>
XSLT处理输入文档并应用模板,因此您需要以产生适当输出的方式编写XSLT。您没有提供有关您拥有的输入以及如何将其映射到所需输出的任何信息,仅是拥有用于输出格式的架构。尽管XSLT 2.0知道基于模式的XSLT处理,这主要意味着验证对一个模式或一组模式的输入和/或输出,但是没有任何魔术可以确保根据模式创建输出。
因此,您将必须编写代码以确保获得所需的结果,包括您要寻找的顺序(分别是架构定义的)。
例如,如果您有输入
<foo>
<child1>...</child1>
<child2>...</child2>
</foo>
你想创建
<bar>
<child2>...</child2>
<child1>...</child1>
</bar>
然后您将模板编写foo
为
<xsl:template match="foo">
<bar>
<xsl:apply-templates>
<xsl:sort select="position()" order="descending"/>
</xsl:apply-templates>
</bar>
</xsl:template>
或者例如
<xsl:template match="foo">
<bar>
<xsl:apply-templates select="child2, child1"/>
</bar>
</xsl:template>
至于您在编辑中提供的具体示例,您已经差不多了,并做了一些改进
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ROOT">
<ROOT>
<xsl:apply-templates select="A1,D1,C1,B1" />
</ROOT>
</xsl:template>
<xsl:template match="A1">
<a1>
<xsl:apply-templates />
</a1>
</xsl:template>
<xsl:template match="B1">
<b1>
<xsl:apply-templates />
</b1>
</xsl:template>
<xsl:template match="C1">
<c1>
<xsl:apply-templates />
</c1>
</xsl:template>
<xsl:template match="D1">
<d1>
<xsl:apply-templates />
</d1>
</xsl:template>
</xsl:stylesheet>
和一个像Saxon 9这样的XSLT 2.0处理器,我得到了
<ROOT>
<a1>A</a1>
<d1>D</d1>
<c1>C</c1>
<b1>B</b1>
</ROOT>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句