Xml XSLT2.0为每个元素创建文档
我有一个XML文件: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>
<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>