使用XSLT拆分.xml文件

使用XSLT拆分.xml文件,xslt,xpath,Xslt,Xpath,我编写了一个XSL文件,它从源文件中读取一些文件名并使用这些文件名来拆分另一个文件(通过document()函数在XSL文件中打开)。文件名用于创建多个输出文件,加载文件的某些部分将写入这些输出文件 <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd=

我编写了一个XSL文件,它从源文件中读取一些文件名并使用这些文件名来拆分另一个文件(通过document()函数在XSL文件中打开)。文件名用于创建多个输出文件,加载文件的某些部分将写入这些输出文件

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance">

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

    <xsl:template match="Root">
        <xsl:apply-templates select="//Link"/>
    </xsl:template>

    <xsl:template match="Link">
        <xsl:result-document href="{@url}" method="xml">
            <xsl:apply-templates select="document('Input.xml')//Node"/>
        </xsl:result-document>
    </xsl:template>

    <xsl:template match="Node">
        <xsl:copy-of select="."/>

        <xsl:if test="following-sibling::*[1][self::NextPart]">
            <!-- write some test node -->
            <xsl:element name="FoundNextPart"/>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

源文件如下所示

<Root>
    <SomeNode>
        <Link url="part_0.xml"/>
        <Link url="part_1.xml"/>
        <Link url="part_2.xml"/>
    </SomeNode>
</Root>
<Root>
    <Node>
        <PartContent>
            <ImportantContent>0</ImportantContent>
        </PartContent>
    </Node>
    <Node>
        <PartContent>
            <ImportantContent>0</ImportantContent>
        </PartContent>
    </Node>
    <NextPart/>
    <Node>
        <PartContent>
            <ImportantContent>1</ImportantContent>
        </PartContent>
    </Node>
    <Node>
        <PartContent>
            <ImportantContent>1</ImportantContent>
        </PartContent>
    </Node>
    <NextPart/>
</Root>

Input.xml文件的结构如下

<Root>
    <SomeNode>
        <Link url="part_0.xml"/>
        <Link url="part_1.xml"/>
        <Link url="part_2.xml"/>
    </SomeNode>
</Root>
<Root>
    <Node>
        <PartContent>
            <ImportantContent>0</ImportantContent>
        </PartContent>
    </Node>
    <Node>
        <PartContent>
            <ImportantContent>0</ImportantContent>
        </PartContent>
    </Node>
    <NextPart/>
    <Node>
        <PartContent>
            <ImportantContent>1</ImportantContent>
        </PartContent>
    </Node>
    <Node>
        <PartContent>
            <ImportantContent>1</ImportantContent>
        </PartContent>
    </Node>
    <NextPart/>
</Root>

0
0
1.
1.
我现在的问题是

<xsl:template match="Node">

我想将Input.xml的内容复制到

<NextPart/>
<NextPart/>

节点。然后我想以某种方式打破当前节点集(//Input.xml的节点),继续下一个//链接。但是对于下一个链接(文件),我想在

<NextPart/>
<NextPart/>

节点

我不确定这是否可行。我也不确定我的方法是否可以用于此。 我读过一些关于使用

<xsl:call-template name="copy">

使用当前节点的以下同级作为参数。但无论如何,我必须通过当前的计数

<NextPart/>


让我知道,要复制哪些内容

如何处理和分组
Input.xml
一次,例如

<xsl:variable name="groups">
  <xsl:for-each-group select="document('Input.xml')/Root/*" group-ending-with="NextPart">
    <group>
      <xsl:copy-of select="current-group()[self::Node]"/>
    </group>
  </xsl:for-each-group>
</xsl:variable>

在全局变量中,然后在模板中

<xsl:template match="Link">
    <xsl:variable name="pos" select="position()"/>
    <xsl:result-document href="{@url}" method="xml">
        <xsl:copy-of select="$groups/group[$pos]/Node"/>
    </xsl:result-document>
</xsl:template>

输出先前分组的
节点
元素