Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用xsl将单个XML文档转换为多个文档_Xml_Xslt_Transform - Fatal编程技术网

使用xsl将单个XML文档转换为多个文档

使用xsl将单个XML文档转换为多个文档,xml,xslt,transform,Xml,Xslt,Transform,给定以下xml文档: <XML> <doc1> </doc1> <doc2> </doc2> <XML> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:str

给定以下xml文档:

<XML>
<doc1>
</doc1>
<doc2>
</doc2>
<XML>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pDocElement" select="'doc1'"/>

 <xsl:template match="/*/*">
  <xsl:if test="name()=$pDocElement">
   <xsl:apply-templates select="." mode="copy"/>
  </xsl:if>
 </xsl:template>

 <xsl:template match="node()" mode="copy">
  <xsl:copy-of select="."/>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

我希望使用xsl转换生成2个XML文档:

<XML>
<doc1>
</doc1>
<XML>



这可能吗?

我们曾经遇到过这个问题,并通过稍微作弊解决了它:

步骤1:创建一个大文件,其中包含由程序指令或注释分隔的不同xml脚本。 步骤2:使用程序将文件剪切成单独的文件

请注意,中间结果是无效的xml,但最终结果是有效的

示例

<doc1>..<doc1>
<!-- SEP -->
<doc2>..<doc2>
<!-- SEP -->
<doc3>..<doc3>
。。
..
..

在XSLT 1.0中,不可能创建多个树作为任何转换的输出,但在XSLT 2.0中,这非常容易

在XSLT1.0中,可以使用EXSLT的扩展元素

或者,可以有一个转换,该转换提供了一个全局(和外部指定的)参数,其中包含必须提取到单个文档中的元素的元素名称:

<XML>
<doc1>
</doc1>
<doc2>
</doc2>
<XML>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pDocElement" select="'doc1'"/>

 <xsl:template match="/*/*">
  <xsl:if test="name()=$pDocElement">
   <xsl:apply-templates select="." mode="copy"/>
  </xsl:if>
 </xsl:template>

 <xsl:template match="node()" mode="copy">
  <xsl:copy-of select="."/>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

嘿,Oded,你比我强——在iphone上编辑xml不是那么容易!好问题(+1)。有关XSLT1.0和XSLT2.0解决方案,请参阅我的答案。+1极好的答案,包括XSLT1.0无扩展解决方案!
<doc1>
  Doc 1 Content
</doc1>
<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="node()|@*" mode="copy">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="/*/*[starts-with(name(),'doc')]">
  <xsl:result-document href="{name()}.xml">
   <xsl:apply-templates select="." mode="copy"/>
  </xsl:result-document>
 </xsl:template>

 <xsl:template match="/*">
  <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>
<t>
    <doc1>
  Doc 1 Content
    </doc1>
    <doc2>
  Doc 2 Content
    </doc2>
    <doc3>
  Doc 3 Content
    </doc3>
</t>
Saxon 9.1.0.5J from Saxonica
Java version 1.6.0_21
Stylesheet compilation time: 868 milliseconds
Loading net.sf.saxon.event.MessageEmitter
Writing to file:/C:/Program%20Files/Java/jre6/bin/doc1.xml
Writing to file:/C:/Program%20Files/Java/jre6/bin/doc2.xml
Writing to file:/C:/Program%20Files/Java/jre6/bin/doc3.xml
Execution time: 151 milliseconds
Memory used: 11467936
NamePool contents: 18 entries in 18 chains. 6 prefixes, 6 URIs