使用xslt进行转换的序列

时间:2014-04-28 14:02:55

标签: xml xsd xslt-2.0

我正在进行从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>

1 个答案:

答案 0 :(得分:2)

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>