XSLT拆分保持一个静态的部分

时间:2017-08-17 19:02:42

标签: xslt split static

我正在尝试将下面的文件拆分为3个项目,并保持最后一个部分相同。另外,我还需要在每个分割开始时出现的Header块(除了最后一个)。

输入文件

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Root>
<List>
        <Header>
                <test1>a</test1>
        </Header>
        <Item>
            <ItemNumber>
                <Number>1</Number>
            </ItemNumber>
        </Item>
        <Item>
            <ItemNumber>
                <Number>2</Number>
            </ItemNumber>
        </Item>
        <Item>
            <ItemNumber>
                <Number>3</Number>
            </ItemNumber>
        </Item>
        <Item>
            <ItemNumber>
                <Number>4</Number>
            </ItemNumber>
        </Item>
        <Item>
            <ItemNumber>
                <Number>5</Number>
            </ItemNumber>
        </Item>
</List>
<List>
    <EOF MaxMsgPerFile="3" >
    </EOF>
</List>
</Root>

这是我试过的

<?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" version="1.0" encoding="UTF-8" indent="yes"/>


  <xsl:variable name="tag">
  <xsl:value-of select="/*/*/EOF/@MaxMsgPerFile"/>
</xsl:variable>

<xsl:template match="/Root">
<xsl:copy>


    <xsl:for-each select="List[not (EOF)]/Item[position() mod $tag = 1]">
        <List>
        <xsl:copy-of select="Header"/>
        <xsl:copy-of select=". | following-sibling::Item[position() &lt; $tag]"/>
        </List>
    </xsl:for-each>

    <xsl:copy-of select="List[EOF]"/>
</xsl:copy>
</xsl:template> 

</xsl:stylesheet>

我得到了我想要的一切,但我看不到每个分裂出现的标题

这是预期的

<?xml version="1.0" encoding="UTF-8"?>
<Root>
<List>
        <Header>
                <test1>a</test1>
        </Header>
        <Item>
            <ItemNumber>
                <Number>1</Number>
            </ItemNumber>
        </Item>
        <Item>
            <ItemNumber>
                <Number>2</Number>
            </ItemNumber>
        </Item>
        <Item>
            <ItemNumber>
                <Number>3</Number>
            </ItemNumber>
        </Item>
</List>
<List>
            <Header>
                <test1>a</test1>
        </Header>
        <Item>
            <ItemNumber>
                <Number>4</Number>
            </ItemNumber>
        </Item>
        <Item>
            <ItemNumber>
                <Number>5</Number>
            </ItemNumber>
        </Item>
</List>
<List>
    <EOF MaxMsgPerFile="3">
    </EOF>
</List>
</Root>

非常感谢任何帮助

由于

1 个答案:

答案 0 :(得分:0)

怎么样:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/Root">
    <xsl:variable name="groupSize" select="List/EOF/@MaxMsgPerFile" />
    <xsl:copy>
        <xsl:for-each select="List/Item[position() mod $groupSize = 1]">
            <List>
                <xsl:copy-of select="../Header | . | following-sibling::Item[position() &lt; $groupSize]"/>
            </List>
        </xsl:for-each>
        <xsl:copy-of select="List[EOF]"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>