我编写了一个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>
Input.xml 文件将具有这样的结构
<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>
我现在的问题是
<xsl:template match="Node">
我想将 Input.xml 的内容复制到
的第一次出现<NextPart/>
节点。然后我想以某种方式中断当前节点集( // // > //链接的。但对于下一个 Link (文件),我想在的第一次和第二次出现之间复制 Input.xml 的内容。
节点。 我不确定这是否可行。此外,我不确定我的方法是否可用于此。
我读过像 使用当前节点的以下兄弟作为参数。但无论如何我必须通过 所以我知道,要复制哪些内容!?<NextPart/>
<xsl:call-template name="copy">
<NextPart/>
答案 0 :(得分:2)
如何处理和分组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>
输出先前分组的Node
元素。