Xml XSLT2.0为每个元素创建文档

Xml XSLT2.0为每个元素创建文档,xml,xslt,Xml,Xslt,我有一个XML文件: <xml> <metadata> <book></book> <info></info> <name></name> </metadata> <customer> <person name = "p1" book="x"></person>

我有一个XML文件:

<xml>
    <metadata>  
       <book></book>
       <info></info>
       <name></name>
   </metadata>
   <customer>
       <person name = "p1" book="x"></person>
       <person name = "p2" book="y"></person>
   </customer>
</xml>

我需要为每个客户创建一个输出文件,其中包含元数据:

产出1:

<xml>
   <metadata>   
       <book></book>
       <info></info>
       <name></name>
   </metadata>
   <customer>
       <person name = "p1" book="x"></person>
   </customer>
   </xml>

输出2:

<xml>
   <metadata>   
       <book></book>
       <info></info>
       <name></name>
   </metadata>
   <customer>
       <person name = "p2" book="y"></person>
   </customer>
</xml>

到目前为止,我所拥有的:

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

<xsl:template match="xml">
        <xsl:for-each select="$persons">
            <xsl:variable name="filename"  select="concat('\output\',@name,'.xml')" />
            <xsl:result-document href="{$filename}" format="xml">
                <xsl:copy>
                    <xsl:apply-templates/>
                </xsl:copy>
            </xsl:result-document>
        </xsl:for-each>
    </xsl:template>    


<xsl:template match="metadata">
    <xsl:copy-of select="@*" />
</xsl:template> 

<xsl:template match="customer">
    <xsl:copy-of select="@*" />
</xsl:template> 

</xsl:stylesheet>


但是有了这些代码,我可以为每个人创建一个文件,但是元数据不在文件中。因此,在我的foreach循环中,我必须为所有节点应用模板。是否有一种方法可以“转到”根节点?

首先,当您应用
xsl时:对于每个
您都在
person
元素的范围内,如果您想复制metada,您不能在“*”上应用模板(这是您对
隐式执行的操作,表示“所有子元素”)

其次,匹配
customer
metadata
的模板只复制属性节点,而不复制节点本身,因此也无法工作。实际上,它们中没有一个是匹配的,因为您应用了person上下文中的模板,即person-child上的模板(而您没有)

因此,我认为这就是您试图实现的目标(完全针对每个目标完成,但可以使用“匹配设计”来代替):


首先,当您应用
xsl:for每个
您都在
person
元素的范围内时,如果您想复制metada,您不能在“*”上应用模板(这是您对
隐式执行的操作,表示“所有子元素”)

其次,匹配
customer
metadata
的模板只复制属性节点,而不复制节点本身,因此也无法工作。实际上,它们中没有一个是匹配的,因为您应用了person上下文中的模板,即person-child上的模板(而您没有)

因此,我认为这就是您试图实现的目标(完全针对每个目标完成,但可以使用“匹配设计”来代替):


首先,当您应用
xsl:for每个
您都在
person
元素的范围内时,如果您想复制metada,您不能在“*”上应用模板(这是您对
隐式执行的操作,表示“所有子元素”)

其次,匹配
customer
metadata
的模板只复制属性节点,而不复制节点本身,因此也无法工作。实际上,它们中没有一个是匹配的,因为您应用了person上下文中的模板,即person-child上的模板(而您没有)

因此,我认为这就是您试图实现的目标(完全针对每个目标完成,但可以使用“匹配设计”来代替):


首先,当您应用
xsl:for每个
您都在
person
元素的范围内时,如果您想复制metada,您不能在“*”上应用模板(这是您对
隐式执行的操作,表示“所有子元素”)

其次,匹配
customer
metadata
的模板只复制属性节点,而不复制节点本身,因此也无法工作。实际上,它们中没有一个是匹配的,因为您应用了person上下文中的模板,即person-child上的模板(而您没有)

因此,我认为这就是您试图实现的目标(完全针对每个目标完成,但可以使用“匹配设计”来代替):


<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" name="xml" />
    <xsl:strip-space elements="*" />
    <xsl:template match="xml">
            <xsl:for-each select="customer/person">
                <xsl:variable name="filename"  select="concat('\output\',@name,'.xml')" />
                <xsl:result-document href="{$filename}" format="xml">
                    <xml>
                        <xsl:copy-of select="ancestor::xml/metadata"/>
                        <customer>
                             <xsl:copy-of select="."/>
                        </customer>
                    </xml>
                </xsl:result-document>
            </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>