XSLT2从嵌套输入结构生成多个输出

时间:2015-09-05 22:07:21

标签: xml xslt xslt-2.0 saxon

我正在使用XSLT 2.0(Saxon PE 9.5)使用xsl:result-document从输入创建多个XML文件。每个项目可以包含多个项目,并且在项目中有typeA和typeB。对于每个这样的类型,我想生成和XML。 例如:
input.xml中

<task>
  <items>
    <item>
      <typeA>
        <id>A1</id>
        ...
      </typeA>
      <typeB>
        <id>B</id>
        ...
      </typeB>
    </item>
    <item>
      <typeA>
        <id>A2</id>
        ...
      </typeA>
    </item>
  </items>
</task>

期望的输出:
out1_typea.xml

<task>
  <items>
    <item>
      <typeA>
        <id>A</id>
        ...
      </typeA>
    </item>
  </items>
</task>

out1_typeb.xml

<task>
  <items>
    <item>
      <typeB>
        <id>B</id>
        ...
      </typeB>
    </item>
  </items>
</task>

out2_typea.xml

<task>
  <items>
    <item>
      <typeA>
        <id>A2</id>
        ...
      </typeA>
    </item>
  </items>
</task>

我开始使用以下转换,根据项目进行拆分:

  <xsl:template match="/task">
    <xsl:for-each select="items/item">
      <xsl:result-document href="out{position()}.xml">
        <task xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
          <items>
            <item>
              <xsl:copy-of select="*" />
            </item>
          </items>
          <xsl:copy-of select="../../(* except items)" />
        </task>
      </xsl:result-document>
    </xsl:for-each>
  </xsl:template>

但不知道如何进一步分类。

1 个答案:

答案 0 :(得分:2)

不仅仅是:

MyMethod(server, om => {
    om.Write(data1);
    om.Write(data2);
});